我应该在哈希后加密我的密码吗?如果是这样如何正确地做到这一点?

Should I encrypt my password after I hashed it? If so how to properly do it?

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

更多的人在 Whosebug 中提问,他们不知道加密和散列之间的区别,这些问题在 SO 的搜索引擎中排名靠前。这没有回答我的问题,也没有帮助我。所以我想确定一些关于散列密码和加密密码的事情。

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

  1. 我需要先过滤一下。 (因无关略过)
  2. 得到 'safe' 形式的密码后,我对其进行哈希处理。

    $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 的安全,以便我可以将其用于进一步使用(用于身份验证)?

不需要 加密密码,只需 运行 通过您的密码哈希,就像您在问题中包含的那样,就可以了。哈希是一种单向运算,所以"impossible"反转哈希得到原始密码

在对密码进行哈希处理后对其进行加密并不会降低安全性,只是不会真正提高安全性。它还引入了更多问题-将密钥放在哪里?

坚持只使用 Argon2,不需要任何进一步的东西。

Now let's say I wanted to secure a new registered user..

  1. I need to filter it first. (Skipped because of unrelated)

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

Now this is the where questions rises.

  1. Do I still need to encrypt the hashed password?

没有。散列是一种单向函数。您无法从其哈希中恢复密码。 (你 可以 使用彩虹 table,它实际上是一个密码列表,会产生特定的哈希值。适当的盐有助于防止这种情况。)

加密此散列没有任何好处。

Another question rises

  1. How do I keep the key_str safe, so I can use it for further use (for authentication)?

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