Java面试题项目经验之交易密码安全机制

如果保护交易密码安全是个很重要的问题,本文梳理一下自己实际开发用的方式,欢迎大家一起讨论!

常见的安全机制

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。

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/81709741