我一直在阅读在mysql数据库上存储敏感数据时使用hash和加密的优缺点,而赞成hash和加密的人的争论只会让我感到困惑和不确定该使用哪一种。
搞砸:
"INSERT INTO users (`id`,`username`,`password`) VALUES("Bob",SHA2("password1234"));"
欺骗:
已弃用
彩虹桌
加密:
"INSERT INTO users (`id`, `username`, `password`) VALUES ("Bob", aes_encrypt("password1234", "key1234"))";
欺骗:
可能不适用于某些排序规则类型
钥匙可能被泄露了
彩虹桌
那么在提供安全性和性能(从数据库快速读取和检索)方面,哪一个更理想呢(在大约1000-5000行的表格中)。
1条答案
按热度按时间kgsdhlau1#
我要说他们两个都不说。你不应该存储密码,即使是加密的。这使得您很容易受到密码窃取的攻击,无论是在组织外部还是内部。另外,sha2本身并没有被否决,您也没有指定哈希长度。sha2-512甚至sha2-256仍然被认为是优秀的加密哈希。您也可以使用较新的sha3/keccak crytographic散列,但是从最近的文献来看,它并没有比sha2更好。这两种方法都得到了nist的认可。
然而,infosec一致认为,一个简单的加密散列不足以正确存储机密。截至2018年,pbkdf2、bcrypt或argon2似乎都被广泛认为是“最佳”加密哈希算法的最佳竞争者。您可以在这个securitystackexchange链接上阅读有关密码和加密哈希的更详细的解释https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846
上面的链接并没有解释argon2,它是最近密码散列竞赛的冠军。您可以在此处阅读更多信息:https://github.com/p-h-c/phc-winner-argon2
我的建议是:
将第四个字段添加到名为
salt
. 这应该是一个真正随机的8+位字母数字字符串,以明文形式存储。将“密码”存储为
CryptoHash(salt + 'password1234')
. 这可以保护您不受彩虹表的影响,因为预先计算彩虹表中所有可能的盐是不可行的。替换
CryptoHash
使用pbkdf2、bcrypt或argon2,您将拥有非常好的密码存储机制。