3

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

更多的人在 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保险箱,以便我可以将其用于进一步使用(用于身份验证)?
4

2 回答 2

4

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

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

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

于 2018-12-18T03:46:40.230 回答
2

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

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

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

现在这是问题出现的地方。

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

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

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

另一个问题出现了

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

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

于 2018-12-18T03:55:36.970 回答