【问题标题】:Encrypting/Decrypting Passwords in ColdFusion在 ColdFusion 中加密/解密密码
【发布时间】:2021-06-10 21:38:48
【问题描述】:

我目前正在使用以下代码加密用户密码并将其存储在我的数据库中:

<cfset encrypted_pass = Hash(#form.pwd#, 'SHA-512')/>

有没有办法在事后解密这个密码?

【问题讨论】:

  • hash() 函数是单向加密。您无法解密密码,也不应以您可以解密的方式保存密码。
  • 好的。我一直在阅读有关 encrypt() 和 decrypt() 内置函数的信息。这通常不用于密码吗?
  • 为了澄清阿德里安的评论和安德鲁的回答,从安全的角度来看,最好使用散列算法而不是可以解密的加密算法。这使得破解密码变得更加困难。
  • 同意其他帖子。加密的密码是个坏主意。只有一个人应该永远知道用户的密码,那就是用户自己。加密和散列有两个非常不同的目的。查看cheatsheetseries.owasp.org/cheatsheets/…。几乎所有来自 OWASP 的内容都是很好的建议。
  • 关于加密密码,我猜这是为了让您可以将密码发送给某人以恢复密码?不要这样做。让他们重置它,并散列新值。给他们一个有时间限制的一次性密码,让他们再次登录以更改该密码。或类似的东西。为了提高安全性,您可以做很多事情。 OWASP 备忘单有很多选择。但是没有人应该能够恢复某人的实际密码。

标签: coldfusion lucee


【解决方案1】:

如果您将密码存储在数据库中,则应始终将其存储为哈希值,而不是使用可逆加密。这样做的方法是这种“散列”,但并非所有散列都是平等的,CFML 中的“散列”函数不足以用于密码散列。

使用散列的原因是,如果“不良行为者”获得对您数据库的访问权限,他们仍然无法获得您的用户密码。

请参阅以下文章,了解 CFML 中良好的密码散列的详细信息和代码示例:

https://www.andrewdixon.co.uk/2020/05/12/password-hashing-in-cfml/

【讨论】:

  • 明白。我明白为什么这是最佳做法。
  • @andrewdixon 虽然您的回答是 100% 正确,并且您的文章描述了更详细的内容,但您仍然应该在这里用一两句话解释为什么应该首选散列而不是可解密的方式来存储密码。
  • @SebastianZartner - 最初回答很快,现在扩展了一点?
  • 盐不需要保密。盐的主要目的是防止对您的数据库运行彩虹表。最好为每个用户使用唯一的盐,但是否有人可以访问您的代码并不重要。单个盐允许某人使用该盐构建彩虹表,但单个盐意味着攻击者必须计算每条记录的哈希值。这非常耗时,尤其是像 bcryptscrypt 这样的东西。 (注意:CF2021 为这些添加了功能:auth0.com/blog/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多