保护密码的最好方法是使用加盐哈希;算法
哈希算法是一种单向函数,把任意数量的数据转换成固定长度的“指纹”,这个过程没法逆转。若是输入发生一点改变,由此产生的哈希值彻底不一样。数据库
用户建立本身的帐号;安全
密码通过哈希加密后存储在数据库中。密码一旦写入磁盘,任什么时候候都不容许明文形式;函数
用户试图登陆时,系统从数据库取出已经加密的密码,和通过哈希加密的用户输入的密码进行对比;编码
若是哈希值相同,用户将被受权访问。不然,告知输入登陆信息无效;加密
只有加密哈希函数才能够用来进行密码哈希加密,像:sha256,sha512,ripemd和whirlpool都是加密哈希函数;ip
破解哈希加密的最简单方法是尝试猜想密码,哈希每一个猜想的密码,并对比猜想密码的哈希值是否等于被破解的哈希值。若是相等则猜中。猜想密码攻击的两种常见的方法是字典攻击和暴力攻击。字符串
破解相同类型的哈希值,查表法是一种很是高效的方式,主要理念是预先计算出密码字典中的每一个密码的哈希值,而后存储相应的密码到一个表里。登录
攻击者从被黑的用户帐号数据库建立一个用户名和对应的哈希表,而后攻击者猜车一系列哈希值并使用该查询表来查找使用此密码的用户。一般许多用户都是用相同的密码,这种方式很是有效。基础
彩虹表是一种以空间换时间的技术。与查表法类似,只是使查询表更小,牺牲了破解速度。由于彩虹表更小,因此单位空间能够存储更多的哈希值,从而使攻击更有效。可以破解任何最多8位长度的MD5值擦彩虹表已经出现。
查表和彩虹表只有在全部密码都以彻底相同的方式进行哈希加密才有效,若是两个用户有相同的密码,他们将有相同的密码哈希值。能够经过随机化哈希,当同一个密码哈希两次后,获得的哈希值是不同的,从而避免了这种攻击。
能够经过再密码中加入一段随机字符串进行哈希加密,这个被加的字符串称为盐值。这使得相同密码每次都被加密为彻底不一样的字符串,须要盐值来校验密码是否正确。一般和密码哈希值一同存储在帐号数据库中。
盐值无需加密,因为随机化了哈希值,查表法,反向查表法,彩虹表都会失效。由于攻击者没法事先知道盐值,因此他们没有办法预先计算。
错误就是每次都是用相同的盐值进行哈希加密,这个盐值要么被硬编码到程序中,要么只在第一次使用时随机得到。这样作法是无效的,由于若是两个用户有相同的密码,他们会有相同的哈希值。
若是盐值过短,攻击者能够预先制做针对于全部可能的盐值的查询表。不该该将用户名做为盐值,对每一个服务而言 ,用户名是惟一的,他们是不可预测的。为使攻击者没法构造包含全部可能盐值的查询表,盐值必须足够大,一个好的经验使用和哈希函数输出的字符串相等长的盐值。
因为哈希函数将任意大小的数据转换成定长的字符串,所以,一定一些不一样的输入通过哈希计算以后获得相同的字符串的状况。可经过加盐的方式解决。
盐值应该使用加密的安全伪随机数生成器产生。必须使用 CSPRNG;
使用 CSPRNG生成足够长的随机盐值;
将盐值混入密码,并使用标准的密码哈希函数进行加密 ,如Argon二、 bcrypt 、 scrypt 或 PBKDF2 ;
将盐值和对应的哈希值一块儿存入数据库;
从数据库检索用户的盐值和响应的哈希值;
将盐值混入用户输入的密码,而且使用通用的哈希函数进行加密;
比较上一步的结果,是否和数据库存储的哈希值相同。相同则密码正确,不然错误;