加密密码时随机使用128位辣椒



我正在使用PHP 7.2开发一个新的web应用程序,我正在考虑以下方法来最大限度地提高密码的安全性。以下是我的计划:

  1. 一个PHP文件包含一个数组,该数组包含100个128位长度的常量标记(开头随机生成(
  2. 当用户注册时
    1. 伪随机从数组(array_rand()(中选择一个pepper并将索引存储在SQL数据库中
    2. 使用hash_hmac("sha256", $password, $pepper);加密密码字符串(其中$pepper是预定义列表中的随机128位字母数字令牌(
    3. 使用Argon2i哈希密码(argon2id不适用于我的服务器(
  3. 当用户登录时
    1. 要检查密码,请取出胡椒粉,再次加密密码并匹配:password_verify(hash_hmac("sha256", $_POST["password"], $pepper), $row["password"])

你认为这种使用辣椒的方法能有效地提高安全性吗?是否存在任何潜在的缺陷和漏洞,特别是PHP?

我在几个论坛上看到,其他人建议使用特定于系统的常量(例如,服务器的硬件+软件配置所特有的常量(,只使用单个胡椒粉等。我实现这一点的目的是,如果攻击者通过SQL注入(例如(成功获取用户数据库,他们可能仍然无法访问我的peppers.php代码。我认为使用一个辣椒很容易被粗暴地强迫。我喜欢我的想法的地方是,我总是可以在多台服务器上扩展这种算法,或者自由增加预定义的辣椒。

这更多的是关于IT安全或密码学,但我们假设提及PHP就足以对StackOverflow执行小型协议分析。

盐的概念是它是独一无二的。这样就无法构建彩虹表,也无法区分相同的密码。salt通常与密码哈希一起存储,应该被视为公共的。

胡椒的想法是它保持秘密,因此无法由无权访问它的攻击者创建密码哈希。这意味着攻击者不可能猜测密码。

现在,您已经定义了一个方案,其中似乎不使用盐,并且辣椒在某种程度上是独一无二的。如果不是这样的话,那就不太好了;例如,创建100张彩虹表看似昂贵,但却是可行的。此外,您将不得不存储多个辣椒/秘密,而不仅仅是一个。

创建随机盐和辣椒(均为128位(比您的方案更安全。不需要HMAC:您可以为Argon2i指定密钥。如果不能,请将盐和胡椒连接起来,并将它们用作盐(或者,如果salt参数有限,则在连接上使用散列(。

相关内容

  • 没有找到相关文章

最新更新