当前位置: 首页 > 知识库问答 >
问题:

密码salt和PBKDF2

艾璞瑜
2023-03-14

尽管我有点困惑,我是否应该将salt输入到我的PBKDF2函数中,并将salt存储在一列中,而将PBKDF2的密码存储在另一列中。

我也在使用CodeIgniter,并找到了一个用于PBKDF2的库(https://github.com/hashemqolami/codeigniter-pbkdf2-library),它声称我不需要单独存储salt。

使用$pbkdf2['hash']作为推荐的用户密码注册用户;无需单独存储用户盐。

https://github.com/hashemqolami/codeigniter-pbkdf2-Library#step-2

所以,如果我假设是正确的,我所需要的就是提供一个密码进入函数,函数负责其余的?

共有1个答案

孙斌
2023-03-14

我是CodeIgniter PBKDF2库的创建者。我刚刚在SO上发现了这个主题,我决定澄清这个库是如何工作的。

以下是文档中的示例代码:

# Load pbkdf2 library into your controller
$this->load->library('pbkdf2');

# Get password, which has been sent via POST method
$password = $this->input->post('password');

# Encrypt the given password using a random generated salt
$pbkdf2 = $this->pbkdf2->encrypt($password);

encrypt()方法返回一个数组,该数组包含3个键:saltpasswordhashhash的值是saltpassword的串联。

这个特性允许用户选择如何使用这个库,是使用salt和password还是hash(salt+password)。

encrypt( string $password [, mixed $good_hash = NULL [, bool $object_output = FALSE]] )

该函数使用给定的$GOOD_HASH作为生成加密密码的盐。如果没有给出$GOOD_HASH参数,则使用随机生成的salt。

因此,如果您已经单独存储了salt,则可以将其作为加密给定密码的第二个参数传递给函数:

$pbkdf2 = $this->pbkdf2->encrypt($password, $salt);

另一方面,如果您已经将saltpassword的连接存储到数据库中,您也可以将其作为第二个参数传递给函数:

php prettyprint-override">$pbkdf2 = $this->pbkdf2->encrypt($password, $hash);

该函数将自动中断给定的$hash以获取salt

因此,您可以将salt和password的串联存储在列中(默认情况下为64个字符),然后使用已存储的旧密码加密新的给定密码。

$this->load->library('pbkdf2');
$password = $this->input->post('password');
$pbkdf2 = $this->pbkdf2->encrypt($password);

# Store $pbkdf2['hash'] into User table as the user's password
$this->load->library('pbkdf2');
$username = $this->input->post('username', TRUE);
$password = $this->input->post('password');

# Fetch the stored user's password from the database
$user_password = $this->user_model->get_password_by($username);

# Check whether the User exists
if ($user_password)
{
    # Encrypt the new given password by using the old one:
    $pbkdf2 = $this->pbkdf2->encrypt($password, $user_password);

    # Check whether the new generated password matches the old one
    if ($pbkdf2['hash'] === $user_password) {
        # Log in the user ...
    } else {
        # Show an error...
    }
} else {
    # Show an error... 
}
 类似资料:
  • 问题内容: 我试图弄清楚如何使用crypto模块对nodejs中的密码进行加盐和哈希处理。我可以这样做来创建哈希密码: 但是我对以后如何验证密码感到困惑。 问题答案: 在您使用的任何持久性机制(数据库)中,您都将在哈希值和迭代次数之间存储结果哈希,这两者都是纯文本。如果每个密码使用不同的盐(您应该这样做),则还必须保存该信息。 然后,您将比较新的纯文本密码,使用相同的盐(和迭代次数)对其进行哈希处

  • 我正在使用以下代码创建哈希密码和salt: 我正在数据库中存储HashedPassword和Salt。 现在我要验证用户登录时的密码: 这不起作用,我得到了一个完全不同的哈希密码,而不是存储在数据库中的密码。据我所知,您应该在用户登录时输入的密码之前预置salt,然后运行相同的哈希密码函数。上面不是等价于那个吗?

  • 作为练习,我用C编写了自己的SHA-512哈希函数实现。我知道它是有效的,因为我从abc 在Base64中。就像在测试现场一样。 我有两个问题: > 如何加密我的密码?如果我有: 我应该创建字符串以输入盐通过="ssssssssmy密钥密码"吗?或者可能以相反的方式?我试图在谷歌上到处寻找答案——我找不到真正合适的东西。 在base64中,我应该使用什么编码来获得像/etc/shadow文件中那样

  • 我已经对我的注册脚本中的密码进行了加密,它们存储在数据库中,我必须使用它们登录,所以我想使用未加密的密码登录。我已经阅读了这里的一些帖子,但没有任何帮助。我如何才能将其添加到我的登录中。php?盐也存储在数据库中。 这是我的登记簿。用于加密的php脚本 这是我的季节login.php

  • 本文向大家介绍C#使用 Salt + Hash 来为密码加密,包括了C#使用 Salt + Hash 来为密码加密的使用技巧和注意事项,需要的朋友参考一下 (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。 解决的办法是将密码加密后再存储进

  • 问题内容: 目前,据说MD5部分不安全。考虑到这一点,我想知道使用哪种机制进行密码保护。 这个问题,“双重哈希”密码是否比仅hash一次密码安全?建议多次散列可能是一个好主意,而如何对单个文件实施密码保护建议使用盐。 我正在使用PHP。我想要一个安全,快速的密码加密系统。将密码hash一百万次可能更安全,但也更慢。如何在速度和安全性之间取得良好的平衡?另外,我希望结果具有恒定数量的字符。 hash