在 MySQL 数据库上存储密码:哈希与加密?

Jae*_*Bin 1 mysql database encryption hash password-protection

我一直在阅读在 MySQL 数据库上存储敏感数据时使用散列与加密的利弊,而赞成散列或加密的人的双方争论只会让我对使用哪个感到困惑和不确定.

哈希:

"INSERT INTO users (`id`,`username`,`password`) VALUES("Bob",SHA2("password1234"));"
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 已弃用

  • 彩虹桌

加密:

"INSERT INTO users (`id`, `username`, `password`) VALUES ("Bob", aes_encrypt("password1234", "key1234"))";
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 可能不适用于某些归类类型

  • 密钥可能被泄露

  • 彩虹桌

那么在提供安全性和性能(从数据库中快速读取和检索)方面,哪个更理想?(在大约 1,000 - 5,000 行的表格中)。

mju*_*rez 7

我要继续说他们都没有。你永远不应该存储密码,即使是加密的。这使您容易受到组织外部或内部密码窃取的影响。此外,SHA2 本身并没有被弃用,并且您没有指定哈希长度。SHA2-512 甚至 SHA2-256 仍然被认为是优秀的加密哈希。您还可以使用更新的 SHA3/Keccak 加密哈希,但从最近的文献来看,它并不比 SHA2 好多少。两者仍然得到 NIST 的认可。

但是,InfoSec 中的共识是,简单的加密哈希不足以正确存储机密。截至 2018 年,PBKDF2、bcrypt 或 ARGON2 似乎被广泛认为是“最佳”加密哈希算法的主要竞争者。您可以在此安全 StackExchange 链接https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords/31846#31846上阅读有关密码和加密哈希的更详细的解释

上面的链接没有解释 ARGON2,它是最近密码哈希竞赛的获胜者。您可以在此处阅读更多相关信息:https : //github.com/phc/phc-winner-argon2

我的建议是:

  • 向名为 的表中添加第四个字段salt。这应该是一个真正随机的 8+ 位字母数字字符串,以明文形式存储。
  • 将“密码”存储为CryptoHash(salt + 'password1234'). 这可以保护您免受彩虹表的影响,因为为所有可能的盐预先计算所有彩虹表是不可行的。

CryptoHash上面替换为 PBKDF2、bcrypt 或 ARGON2,您将拥有一个非常好的密码存储机制。