【问题标题】:PHP AES Encryption of passwords and hashesPHP AES 密码和哈希加密
【发布时间】:2013-12-18 17:40:24
【问题描述】:

今天我读到了 AES(A 高级 E ncryption S 标准),我问自己一些我不知道的问题有知识自己回答。

我在 Wikipedia 中读到,即使是绝密文件,AES 也可以安全使用,直到现在,没有人找到破解它的方法。确实有一些尝试使用侧信道攻击,但它并没有那么顺利,因为它没有攻击加密本身。

根据我所读到的内容,我想知道,我应该使用 AES 来加密我的数据库中的密码吗?我可以保存加密的密码,或者更确切地说使用hash() 函数来加密数据库中字符串的 AES 加密,从而以某种方式为其提供“双层”保护。我在这里可能完全错了,我只是想知道在数据库中存储加密字符串时它不常见的原因是什么。我想那是因为有一种解密方法,但是要解密它,您仍然必须知道代码用于加密它的轮数。

提前致谢!

【问题讨论】:

  • 为什么不只存储密码的加盐哈希?首先,您必须能够检索密码的可能目的是什么?如果用户忘记了密码,只需让他们重新设置即可。
  • This is what can go wrong 当可逆加密而不是加盐单向哈希用于密码存储时。
  • 不要加密密码,正是因为加密可逆的
  • @kfirba 那没用。散列在实践中通过存储加盐+散列值然后当用户输入密码时,加盐+散列输入值并将其与数据库中的值进行比较来工作。密码的原始内容实际上已丢失。在散列后加密它不会获得任何东西,因为弱点仍然是您的服务器安全性,它必须以某种方式保存或访问 AES 加密密钥。暴露散列密码表的代码缺陷或服务器漏洞也可能暴露解密散列所需的密钥。那里没有收获。
  • @Louis,通常,您只需将盐存储在哈希旁边。盐不是秘密,它只是随机的。

标签: php database security encryption


【解决方案1】:

我应该使用 AES 加密数据库中的密码吗?

存储加密密码(而不是哈希值)的问题在于加密是可逆的。实际需要存储密码而不是简单地拥有一种对用户进行身份验证的机制是非常罕见的。 建议加密(可逆)密码,您应该有充分的理由忽略这种做法。

我可以保存加密的密码,或者使用 hash() 函数 加密数据库中字符串的 AES 加密 某种意义上的“双层”保护。

在这里很难说出你在问什么,但我猜你是在问加密哈希值是否会让你的系统更安全。

答案是肯定的,只要您安全地存储用于加密的密钥,并将其与哈希分开。然而,这只增加了与分离所提供的保护一样多的保护。是否值得让应用程序复杂化,尤其是考虑到使用像样的散列算法的加盐和散列值应该足够好这一事实?

我觉得如果加密哈希值是值得的,那将是标准做法,但事实并非如此。

【讨论】:

  • 只是为了补充您的答案,提供“双层”保护的更好方法是使用随机盐。
  • 是的,盐的唯一要求是它是随机的。
  • 使用随机的长盐,并使用慢散列算法(即多轮散列)。这两个要求的要点是,如果盐和散列密码被泄露,那么暴力破解密码或生成彩虹表会非常耗费时间和资源。参见,例如:security.stackexchange.com/questions/211/…
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2011-12-06
相关资源
最近更新 更多