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

简介:

假设你在设计自己的系统的时候采用的是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,如需转载请自行联系原作者
目录
相关文章
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
9月前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
1012 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
408 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
291 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
920 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
370 5
|
存储 NoSQL Java
|
安全 数据安全/隐私保护 Python
情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
181 2
|
9月前
|
云安全 安全 数据建模
《数字证书:互联网世界的"身份证"与"防盗门"》 ——揭秘网络安全背后的加密江湖
在2023年某深夜,上海陆家嘴金融公司机房遭遇黑客攻击,神秘青铜大门与九大掌门封印的玉牌突现,阻止了入侵。此门象征数字证书,保障网络安全。数字证书如验钞机识别假币,保护用户数据。它通过SSL/TLS加密、CA认证和非对称加密,构建安全通信。证书分为DV、OV、EV三类,分别适合不同场景。忽视证书安全可能导致巨额损失。阿里云提供一站式证书服务,助力企业部署SSL证书,迎接未来量子计算和物联网挑战。