1. 一般数据库中存储密码使用MD5或者SHA系列(如SHA1、SHA256、SHA384、SHA512等)
- 这两种算法都是单向的Hash(不可逆),MD5为128位,SHA1为160位(位数长,所以SHA1穷举破解比MD5难)。从理论上来说,有可能不同的数据生成同样的MD5值。
- 均有彩虹表可破。
- 加盐可以应付彩虹表。加盐后,密码长度数倍增长,相应彩虹表会扩大无数倍,这样的彩虹表是很难存储的,无法通过以空间换时间的方式去破解。但如果是固定盐,并且盐丢了,只需要重新计算一份彩虹表即可破解。随机盐能进一步增加安全性,因为即使脱库后查到了盐,并且有源码知道加盐规则,也需要针对每个用户生成一份彩虹表,所以完全破解也不现实,只有可能去单独破解。
- 算法BCrypt通过多次Hash提高安全性,增加彩虹表的生成时间来达到无法破解,但这种算法同时也减慢了登录时的速度,因为需要大量计算。
- 感觉BCrypt不太划算,一般hash+salt即可,但最好盐、数据库、源码分开存放,这样能大大降低风险。
http://drops.wooyun.org/papers/1066
2. 传输数据加密:AES(对称加密)、RSA(非对称加密)
- 对称加密:加密和解密的密钥相同。加解密速度快,密钥管理困难,主要用于大数据量的加密。
- 非对称加密:即公钥加密。公钥公开,用于加密;私钥保存用于解密。从公钥到私钥的过程是不可逆的。密钥管理方便,加解密速度慢,主要用于密钥交互密钥的管理。
- 根据以上两点可知,现在一般客户端使用RSA公钥加密首次连接时的信息(信息中包含AES密钥),服务端使用RSA私钥解密后得到AES密钥,接下来的数据传输均采用AES解密即可。这种做法与HTTPS的做法非常类似,见http://blog.csdn.net/alongwilliam/article/details/7658785,该文章也解释了HTTPS中间人攻击。