注册和登录还有那个加密的密码

简介:

假设你在设计自己的系统的时候采用的是MVC架构。例如

 

也许可能有很多童鞋会这样设计Service和Model.

service:

public class AccountService 

    public bool Login(string userName, string password) 
    { 
        // insert into account values(userName,password); 
        return true
    } 

    public bool Register(string userName, string password) 
    { 
        // select count(*) from account where userName = userName and password = password; 
        return true;        
    } 
}

然后model是这样的:

public class UserModel 

    public bool Login(string userName, string password) 
    { 
        string encryptedPassword = password.MD5(); 

        AccountService accountService = new AccountService(); 
        return accountService.Login(userName, encryptedPassword); 
    } 

    public bool Register(string userName, string password) 
    { 
        string encryptedPassword = password.MD5(); 

        AccountService accountService = new AccountService(); 
        return accountService.Register(userName, encryptedPassword);        
    } 
}

 

很明显,这段代码完成了注册和登录的任务,并且密码也是以加密的形式保存的。

比如123456 =>e10adc3949ba59abbe56e057f20f883e

 

当然有些人会认为密码不够安全,然后进行两次md5,或者是加salt,加userName,等。

 

下面抛一个问题:聪明的你认为上面的这种设计安全吗???

 

 

如果你认为上面的代码很安全,那么你就很需要往下面看看了。

Service和Model这样设计的缺点:

1:加密在model层中做,如果你有多个界面的话,我指的是客户端(asp.net,android,php…).然后这些客户端调用的是service层中的方法,那么这些客户端都需要先将密码进行加密,然后调用服务。

image

现在需要增加php客户端,android 客户端。于是变成了:

image

所以asp.net Model, php Model, android Model 都需要进行相同的加密,并且你需要保证这三个平台所加密的字符串是相同的,

比如123456 =>在这三个Model层中都必须被加密为:e10adc3949ba59abbe56e057f20f883e

这是一个很恶心的问题,不过幸运的是这三个平台的md5 加密出来的是一样的,如果不一样的话,可能是需要设置下字符编码。

 

2:上面的这个缺点虽然比较严重,但还不是最致命的,这个设计最致命的地方在于Service层没有进行加密验证,如果你获取了用户的用户名和密码的话,直接登录就OK了。

 

假设A用户的用户名为LoveJenny,密码为123456.

在数据库中储存的值是LoveJenny,e10adc3949ba59abbe56e057f20f883e。

对于hacker而言,他偶然获取了用户名:LoveJenny,密码:e10adc3949ba59abbe56e057f20f883e

 

首先他尝试试用LoveJenny 和e10adc3949ba59abbe56e057f20f883e 来调用Service服务登录系统,f**k,Service 没有验证,于是他便登录了,他不需要知道LoveJenny的密码是123456,同时也不需要理解e10adc3949ba59abbe56e057f20f883e 是怎样生成的,他只需要输入用户名:LoveJenny,然后密码:e10adc3949ba59abbe56e057f20f883e 来调用服务就可以登录了。

 

最后如果你还是认为:

1:他是怎样偶然得到LoveJenny和e10adc3949ba59abbe56e057f20f883e 的?

这点我无法回答,因为我也不知道hacker会怎样获取,不过可以肯定的是,只要你的系统不是很安全的话,应该是可以获取的。

2:多个model中做验证没什么大不了的?

这点我持反对意见,首先它违反了don’t repeat your self 原则,其次,把本该服务层中做的事情放到

model层来做,最后假设你的系统有多个平台的话,很郁闷的哦。

3:就算知道用户名和数据库密码,他又怎样绕过model来调用服务呢?

这个。。。,我还是不知道,不过万一你的服务是暴露在外网上的,如果你老板想让你做个开放平台,如果你的服务器被hacker掉了。。。,当然如果很多很多。。,借口

 

 

不要认为安全是个组件,到时候拿过来用就行了,个人认为在开发和设计的时候,就应该考虑安全,当然绝对的安全是不可能的,我们只能保证我们该做的都做了,而不是把这些安全漏洞归咎于上面的几点,或者是更多点。

最后的最后我贴上我认为正确的设计:

 

Service层:

public class AccountService 

    public bool Login(string userName, string password) 
    { 
        string encryptedPassword = getEncryptedString(password); 

        // insert into account values(userName,encryptedPassword); 
        return true
    } 

    public bool Register(string userName, string password) 
    { 
        string encryptedPassword = getEncryptedString(password); 

        // select count(*) from account where userName = userName and password = encryptedPassword; 
        return true;        
    } 
}

 

Model层:

public class UserModel 

    public bool Login(string userName, string password) 
    { 
        AccountService accountService = new AccountService(); 
        return accountService.Login(userName, password); 
    } 

    public bool Register(string userName, string password) 
    { 
        AccountService accountService = new AccountService(); 
        return accountService.Register(userName, password);        
    } 
}






本文转自LoveJenny博客园博客,原文链接:http://www.cnblogs.com/LoveJenny/archive/2012/07/09/2582080.html,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
26 0
|
5月前
|
前端开发 JavaScript 数据安全/隐私保护
Jmeter模拟加密密码登录
Jmeter模拟加密密码登录
104 0
|
3月前
|
移动开发 JavaScript 安全
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
js的常见的三种密码加密方式-MD5加密、Base64加密和解密和sha1加密详解总结
101 0
|
25天前
|
编解码 Java Nacos
nacos常见问题之密码加密配置如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
127 0
|
26天前
|
存储 运维 Nacos
nacos常见问题之连接用户名和密码把明文用户名和密码进行加密如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
164 2
|
1月前
|
算法 前端开发 JavaScript
SpringBoot+随机盐值+双重MD5实现加密登录
SpringBoot+随机盐值+双重MD5实现加密登录
156 1
|
1月前
|
应用服务中间件 Nacos 数据安全/隐私保护
nacos常见问题之如何用明文密码做加密
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。
96 0
|
1月前
|
存储 API 数据库
微搭低代码密码加密存储
微搭低代码密码加密存储
|
3月前
|
PHP 数据安全/隐私保护