【问题标题】:Should I encrypt my password after I hashed it? If so how to properly do it?我应该在哈希后加密我的密码吗?如果是这样如何正确地做到这一点?
【发布时间】:2019-05-18 11:02:14
【问题描述】:

我试图更好地了解散列和加密,但是我偶然发现了一些我似乎无法在 Google 中找到的问题,因为 Google 一直在提供我已经阅读过的散列和加密的基本区别。

更多的人在 StackOverflow 中询问,他们不知道加密和散列之间的区别,这些问题进入了 SO 搜索引擎的顶部。这没有回答我的问题,也没有帮助我。所以我想确定一些关于散列密码和加密密码的事情。

现在假设我想保护一个新的注册用户..

  1. 我需要先过滤它。 (因无关而略过)
  2. 在获得“安全”形式的密码后,我对其进行哈希处理。

    $safePassword; // Already filled with safe password. $hash = password_hash($safePassword,PASSWORD_ARGON2I);

  3. 然后将其插入数据库。

现在问题出现了。

  1. 我还需要加密散列密码吗?

  2. 如果是这样,我如何安全地加密密码? (我将使用 AES)

AES_ENCRYPT(str, key_str);

其中str 是我们要加密的字符串,key_str加密密钥。

另一个问题出现了

  1. 如何确保key_str 的安全,以便我可以将其用于进一步使用(用于身份验证)?

【问题讨论】:

  • 使用适当的散列算法进行散列通常足以保护密码,但之后加密散列确实更安全。如果您想了解有关此主题的更多信息,请查看我关于 safely storing passwords 的教程的结尾。

标签: php encryption passwords aes argon2-ffi


【解决方案1】:

不需要加密密码,只需通过密码哈希运行它,就像您在问题中包含的那样,非常好。散列是一种单向运算,因此“不可能”反转散列并得到原始密码。

在散列密码后加密密码不会降低安全性,它也不会真正让事情变得更安全。它还引入了更多的问题——把钥匙放在哪里?

只使用 Argon2,不需要任何进一步的操作。

【讨论】:

  • 啊,谢谢!对于如此快速的回复..所以我应该避免除 Argon2 之外的另一种散列算法? 另外这可能是一个新手问题。这是否意味着每种语言(或只是众所周知的一种)总是支持 Argon2 算法?
  • 有许多密码散列算法被认为是安全的。包括 Argon2,还有 bcrypt、scrypt 和 PBKDF2。不建议将 PBKDF2 用于新工作。 bcrypt 可以说是最常见的。 Argon2 是最新的。
【解决方案2】:

现在假设我想保护一个新的注册用户..

  1. 我需要先过滤它。 (因无关而略过)

如果通过“过滤器”,您的意思是以某种方式更改此密码.... 不!您不仅不需要这样做,实际上以后还会让自己非常头疼路,降低了密码的安全性。

现在问题出现了。

  1. 我还需要加密散列密码吗?

没有。散列是一种单向函数。您无法从其哈希中恢复密码。 (您可以使用彩虹表,它实际上是导致某些哈希的密码列表。这就是适当的盐有助于防止的。)

加密这个哈希没有任何好处。

另一个问题出现了

  1. 如何保证 key_str 的安全,以便我可以将其用于进一步使用(用于身份验证)?

这实际上是加密没有用的一个关键原因。要使用它,您需要对其进行解密,这意味着首先将密钥与哈希数据放在同一位置。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2011-01-03
    • 2011-03-03
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    相关资源
    最近更新 更多