存储用户密码和数据

来自:https://blog.csdn.net/u012491783/article/details/79465559

密码阶段:

1、单向hash(MD5)

  以MD5和sha算法为代表,这类做法比明文直接存储看起来要安全,但是如果在db被攻破的时候,以目前计算机的算力加之黑客的各种技术手段,其实跟明文是差别不大的,我们知道密码学里面破解密码最笨的一种方法是暴力破解,随着目前计算机硬件的发展,带来计算能力的提升,每秒钟上亿次的hash计算已经不是问题,直接暴力破解几乎是分秒的事情,另外与之相近的有一种字典表/彩虹表破解的手段,原理很简单,黑客们会把常见密码以及各种hash算法加密后的字符串整理到一个表中,因为只要是同一明文密码同一hash算法得出的值就是一样的,也就是说黑客不断完善整理的彩虹表可以用来任何MD5加密系统的破解,带着破解的db用户MD5密码那一列信息,直接循环去select 明文 from 字典表/彩虹表 where 密文 = 密码,基本可以破解目前多数人设置的普通密码。

2、hash+salt

  早期为了改进单向hash的缺陷,为了让彩虹表失效,引入了盐,盐是随机生成的一个唯一字符串,连在明文密码后增强密码的随机性,然后再做hash得到的加密密文存储在db中,这样一个是相同的密码存在db中的值就不同了,另一个是彩虹表也不会再起作用了。但是同样以目前计算机的算力,暴力破解也是分分钟的事情,因为为了校验密码的原因,我们一般会把这种方法生成的密码和盐一块存在db中,明文+盐 hash= 密码,黑客在拿到盐和加密密码后,只需要用计算机不断去生成明文,然后计算就可以很快破解。这种方法是避免了彩虹表,但是暴力破解还是避免不了。

3. PBKDF2, BCrypt 或 SCrypt 算法 

  这类算法有一个特点,算法中都有个因子,用于指明计算密码摘要所需要的资源和时间,也就是计算强度。计算强度越大,攻击者建立rainbow table越困难,以至于不可继续。这类算法也可以保证即使计算能力不断提高,只要调整算法中的强度因子,密码仍然不可能被轻易的攻破。

4、第三方密码服务商


我感觉 怎么才能安全呢,就是 将密码的计算,不单纯是固定的算法 ,而是加入物理因素,也就上面提到的计算过程中所需要的资源等因素来确定结果

由伪随机数和真随机数的联想到的:

只要这个随机数是由确定算法生成的,那就是伪随机,只能通过不断算法优化,使你的随机数更接近随机。

通过真实随机事件取得的随机数才是真随机数。计算机系统可以产生统计意义上的真随机数,

如果把软件,代码,算法想象成一个封闭的系统,那么也许可以引入系统以外的变量?比如说,硬件?

一个典型的例子是 Unix 内核中的随机数发生器(/dev/random),理论上它能产生真随机。即这个随机数的生成,独立于生成函数,这时我们说这个随机数发生器是非确定的。

具体来讲,Unix 维护了一个熵池,不断收集非确定性的设备事件,即机器运行环境中产生的硬件噪音,来作为种子。

比如说,时钟,IO 请求的响应时间,特定硬件中断的时间间隔,键盘敲击速度,鼠标位置变化,甚至周围的电磁波等等……直观地讲,你每按一次键盘,动一下鼠标,邻居家 wifi 信号强度变化,磁盘写入速度等等信号,都可能被用来生成随机数。

猜你喜欢

转载自www.cnblogs.com/doublethree/p/9691519.html