gpt4 book ai didi

codeigniter - 密码盐和PBKDF2

转载 作者:行者123 更新时间:2023-12-02 21:45:38 26 4
gpt4 key购买 nike

我正在研究有关在数据库中存储密码的不同解决方案。读了很多书后,我想我最终会得到PBKDF2

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

我还使用 CodeIgniter 并找到了 PBKDF2 的库 ( https://github.com/HashemQolami/CodeIgniter-PBKDF2-Library ),该库声称我不需要单独存储盐。

Register user by using $pbkdf2['hash'] as user's password which has been recommended; no need to store user's salt separately.

https://github.com/HashemQolami/CodeIgniter-PBKDF2-Library#step-2

所以,如果我假设正确,我需要的只是向函数提供密码,然后函数会处理其余的事情?

最佳答案

我是 CodeIgniter PBKDF2 Library 的创建者。刚刚在 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() 方法,returns an array它有 3 个键:saltpasswordhashhash 的值是 saltpassword 的串联。

此功能允许用户选择如何使用此库,是使用密码还是哈希( + 密码)。

encrypt()方法的语法:

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

该函数使用给定的$good_hash as the salt生成加密的密码。如果未给出 $good_hash 参数,它会使用随机生成的salt

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

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

另一方面,如果您已将saltpassword 的串联存储到数据库中,则可以将其传递给函数,如下所示第二个参数也是:

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

函数will break the given $hash自动获取

因此,您可以将密码的串联存储在一列中( 64 characters by default ),然后使用旧存储的密码来加密新的给定密码。

将所有内容放在一起

接下来,我将向您展示如何使用此库来注册/登录用户,而无需单独存储密码。 p>

注册用户:

$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...
}

关于codeigniter - 密码盐和PBKDF2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19569042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com