按照措施将密码安全等级划分为5层:
username password
tom 123456
验证流程:
相同:登陆成功 不同:登陆失败 使用哈希算法(可以是md5, sha1, sha256,sha512 结果长度依次增长):
123456→SHA-512→ba3253876aed6b
username password
tom ba3253876aed6b…
**哈希算法缺点: ** 1.容易遭受彩虹表(rainbow table, 如下)攻击!通过把大量的哈希值和原密码存储的组合存储在表中。达到用得到的hash值反向查询原密码。
hash_value original_password
ba3253876aed6b… 123456
c70b5dd9ebfb6f… abc123
b109f3bbbc244e… password
… …
2.另外一个缺点是可以看到谁有相同的密码
username password
tom ba3253876aed6b…
jerry ba3253876aed6b…
… …
学名叫加盐(salt),salt可以简单的理解成:随机产生的一定长度的,可以和密码相结合,从而使hash算法产生不同结果的字符串。
123456 + 0x23f22(salt)→SHA-512→bc22711a45e73e5e50f8...
username salt password
tom 0x23f22 bc22711a45e73e5e50f8…
优点:这种方法会极大防止受到彩虹表的攻击,因为即便攻击者构造出彩虹表,因为你使用了 hash(密码+ salt),攻击者彩虹表里的哈希值(hash(密码))和你数据库中的哈希值是不同的。 缺点: 如果攻击者知道了salt和你的哈希值,就可以计算出你的原始密码(当然也没有那么容易)
增强版本: 两次MD5,使用一个随机字符串salt与密码的md5值再进行一次md5,使用很广泛 由于现在的彩虹表大部分是针对一次md5的,当然可能存在多次md5的彩虹表,那么我们可以多次md5,大大增加他的存储成本和少量的计算成本
通过迭代计算的方式增加计算密码的成本。迭代的周期控制在用户可以接受范围内,这样攻击者的计算和时间成本就会大大增加。
123456 + 0x23f22(salt)→SHA-512 (500000 times)→bc6567567a45e73...
username iteration salt password
tom 500000 0x23f22 bc6567567a45e73…
类似的方法可以使用: BCript(比正常的hash+salt慢10000倍,因此增加了10000倍的破解成本)
hashed value = BCript(password,salt,cost factor)
123456 + 0x23f22(salt) + 10 (cost factor)→BCript→bc6567567a45e73...
username password
tom $2a$10$rocuFOLJQLDDM12XMDJ32
注:
密钥(Encryption key) + BCript的结果→AES 256→ox2c78a32f...
username password
tom ox2c78a32f…
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。