APP创业项目-密码加密

喜欢这篇文章吗?分享给你的朋友吧~ 

用户名和密码是用户登录系统的身份凭证,用户注册时向服务器提交用户名和密码,服务器写入数据库后,用户登录时提交相同的用户名和密码,如果两者能够跟数据库中的某一条记录匹配,则身份认证通过,建立会话。用户名和密码数据的安全至关重要。本文主要讨论密码的加密问题。

为什么要对密码加密?

首先,将密码明文写入数据库是一件没有道德的事情。很多用户习惯于在各个网络平台使用同一个用户名和密码,如果系统记录了用户的密码明文,那么开发人员就可以直接看到用户的密码,如果用户注册时还留下了邮箱,且用户的邮箱使用了相同的密码,那么开发人员就可以进入用户的邮箱随意浏览了。

其次,一旦网站被攻击,数据库泄露,攻击者将获取到所有用户的密码,这是一件非常可怕的事情,这类事情CSDN博客网站就发生过。

将密码加密后写入数据库,网站开发人员和窃取了数据的黑客都无法知道密码明文,只能依赖密码破解,这一定程度上保障用户的安全。那么,如何加密密码才尽可能安全?下面讨论密码加密相关的几个概念。

哈希函数

哈希函数是一个单向的字符映射算法,能够将任意长度的数据转换成统一长度的密文(哈希散列),该函数不可逆。

哈希函数的性质

1)不可逆性:由散列值反向无法计算得到输入值。

2)确定性:每个输入值唯一对应一个散列值。但是,一个散列值有极小的可能对应不止一个输入值,称为“哈希碰撞”。

 哈希函数的破解方法

1)暴力破解,尝试各种可能的字符组合,采用相同的哈希函数进行计算,期望得到与密文一样的散列值。这种方法效率非常低,一般通过获取附加信息来减少组合的可能性,例如获取密码的长度、密码组合采用的字符集合。

2)彩虹表,对特定的哈希函数,收集常用的明文和密文对应表,通过表查询的方式查找是否有待破解的密文记录存在。这种方式效率比暴力破解要高,但是要求彩虹表尽可能大而全,且每个哈希函数都要有相应的彩红表。当前用得比较多的MD5的彩红表网上很多,因此加密不应采用MD5这种常见的哈希函数。

提升破解的难度

1)增大计算复杂度,让哈希函数执行效率变低,使用bcrypt或者PBKDF2慢速哈希函数,可以通过迭代次数来控制执行效率,使得暴力破解时需要的硬件计算能力提高,破解时间大大延长,以致于无法进行。但降低执行效率的同时要保证执行时长满足用户正常使用,例如将单次哈希的时长不超过0.5秒。

2)加盐(salt),越简单和常用的密码越容易被彩虹表收录或者暴力破解,因此在密码中加入一些随机的字符串,会增大密码的随机性,从而增大破解的难度。盐对于每一个密码应该采用不同的随机值。如果盐是统一的,那么只要有破解出几个密码,即可猜出盐,从而基于盐拼接字符串进行暴力破解。但如果盐是不同的、无规律的,那么暴力破解的难度将大大提升。既然每个密码的盐都是不同的,那么盐也必须随密码一起写入数据库。

防止传输过程中密码明文被截获

1)使用HTTPS协议,HTTPS协议对传输的HTTP报文进行了加密处理,中间路由器截获后无法获得明文或者篡改报文数据。

2)密码加密后传输,采用非对称加密方法,客户端(浏览器、APP)使用公钥对密码进行加密,服务器使用私钥解密。

防止操作系统或者输入法截获密码明文

用户在使用键盘输入密码时,操作系统、输入法和电脑中的木马,都可以获取到键盘的输入,从而获取密码。

1)低级键盘钩子,例如支付宝安全控件,捕获用户键盘事件改变键盘按键的映射,使得操作系统和输入法不知道按键值。

2)软键盘,不使用键盘输入密码,而是让用户点击屏幕中的元素或者自定义的键盘,建设银行、工商银行的网银客户端都提供了自定义的键盘。

如何设计APP的密码加密机制

根据上文的分析,我们知道加密一个密码涉及到哈希函数、盐。

哈希函数,不使用常用的MD5哈希函数,采用慢速的、安全性更高的pbkdf2_sha256哈希函数。

盐,每个用户采用不同的盐,并将盐与密码一起存储。

因此,本文推荐使用如下结构生成并存储密码(Django的用户模块采用的方法):

哈希函数$盐$密文

pbkdf2_sha256$iweGBjEWlk$GkMwIkdWKLlW5d7dJIO566JJkoIUbv=

用$符号将哈希函数、盐和密码连接起来存储。我们也可以分为三个字段存储这三个值。为什么要把哈希函数也写入数据库呢?

假设这样一个场景:

1)产品V1版本使用了pbkdf2_sha256哈希函数进行加密,突然有一天一个天才研究了一个算法,能够把pbkdf2_sha256的密文直接逆向计算,那么pbkdf2_sha256这个加密方法就没有意义了,必须要更换新的加密算法。开发人员需要对所有密码进行重新加密,但是开发人员并不知道明文是什么,也就无从加密。开发人员想出了一个办法,在用户登录成功后重新生成密文,这是个不错的想法。于是,一些登录过的用户改过了密码,而没有登录的还是老的加密方式。此时系统中密码存在两种加密方式,如何判断用户该用哪种加密方法进行数据匹配呢?我们必须引入一个字段记录用户的加密方式,因此需要将哈希函数一并写入数据库。为了隐藏哈希函数,我们也可以用一个代号例如P3代表pbkdf2_sha256哈希函数。

 

总结

本文简要阐述了密码加密的相关概念,推荐一种有效的密码加密方法。

声明:本文谢绝转载。

版权声明:本博客所有内容,文尾声明谢绝转载的文章禁止转载,未声明谢绝转载的文章,遵循 CC BY-NC-ND 协议,分享-署名-非商业-禁止演绎。
原文链接:APP创业项目-密码加密
来源站点:ComingX

2 Responses to “APP创业项目-密码加密”


Leave a Reply

使用新浪微博登陆