如果保护交易密码安全是个很重要的问题,本文梳理一下自己实际开发用的方式,欢迎大家一起讨论!
常见的安全机制
1 摘要式验证
设置密码主要验证流程:
1: 密码MD5生成摘要
2 入库
交易密码验证主要流程:
1 把用户输入的密码生成MD5摘要
2 MD5串与数据库中设置的比较,是否相等
除了MD5,也可以利用SHA1,SHA256,SHA512等hash算法
123456→SHA-512→ba3253876aed6b
优点:简单易用,hash效率高
缺点:采用暴力破解或者彩虹表,很容易攻破,尤其是密码是简单等六位数字,可以通过hash值反向查询密码。
也可以窥探哪些相同的hash值,因为不同的用户交易密码可能一样,更久
2 哈希加盐
为了解决摘要加密的缺点,最常见的就是加salt。加salt后,不同用户即使相同的密码,相同的摘要,存入数据库也是不同的摘要。
而且,加盐后,如果每个用户都是不同的随机slat,对于黑客攻克批量客户增加了成本。
123456 + 0x23f22(salt)→SHA-512→bc22711a45e73e5e50f8...
每个用户有一个固定的salt值,salt值不会每次发生变化,否则没有办法验证密码。固定salt如果泄漏会不会影响安全性?
优点:一定程度防御彩虹表的攻击,因为黑客构造出来的彩虹表跟你数据库的hash值不一样。增加破解成本。
缺点:如果salt值和md5值泄漏,还是可以破解的,当然需要一定的成本。
增强版本可以使用两次MD5,由于目前彩虹表大多针对一次md5,所以可以增加破解成本
3 哈希加盐加迭代次数
通过迭代计算的方式增加计算密码的成本。迭代的周期控制在用户可以接受范围内,这样攻击者的计算和时间成本就会大大增加。
123456 + 0x23f22(salt)→SHA-512 (500000 times)→bc6567567a45e73...
目前我使用的就是Bcrypt方式,可以设置cost factor,默认是10,增加计算成本,从而提高破解难度。
但是缺点是,如果并发量大,要注意factor的设置,如果太大,影响系统性能。
4 加密上面的密文结果
密钥(Encryption key) + BCript的结果→AES 256→ox2c78a32f...
利用AES加密算法加密Bcrypt的密文,或者MD5的结果,增加破解难度。
需要注意的是密钥的管理,AES是对称加密,前端和后台共享一个密钥,前端的密钥如何存储?
可以选择密钥存储在不同的数据源,比如amanzon提供的HMS服务。这样密码和密文不在一起,增加攻击难度。
参考文章
https://blog.csdn.net/chenyao1994/article/details/80271100
5 密钥保存
方法四通过密钥加密增加了安全性,但是密钥的保存需要特别注意,经常更换密钥,或者把密钥存储在其它数据库,增加破解难度。
还有一种是我比较推荐的,通过其它云服务提供的密钥管理服务,进行密钥管理,比如amanzon的HSM。