我目前正在为 PHP 的核心开发一个“帮助函数”,以使密码散列对大多数开发人员来说更安全、更容易。基本上,目标是让它变得如此简单,以至于发明自己的实现比使用核心安全实现更难。随着散列方法的改进,它还被设计为在未来进行更新和扩展。
我已经为 add 编写了一个RFC,并且还 实现了这些功能。
基本前提是crypt
对于广大开发者来说直接正确使用太难了。奇怪的错误返回,类似 base64(但使用不同的字母)的盐等。所以这些函数旨在消除这种猜测,并提供一个非常简单的 API。
string password_hash(string $password, string $algo = PASSWORD_DEFAULT, array $options = array())
bool password_verify(string $password, string $hash)
string password_make_salt(int $length, bool $raw_output = false)
Password_Hash 接受密码、可选算法说明符(目前仅CRYPT_BCRYPT
支持改进的实现,但希望scrypt
稍后作为选项添加)和选项数组。options 数组可以指定cost
bcrypt 的参数,以及预定义的 salt 值。
Password_Verify 接受密码和现有哈希。然后它重新散列密码(与 相同$tmp = crypt($password, $hash)
)。然后,它使用恒定时间比较函数来确定两个哈希是否确实相等。
Password_Make_Salt 的存在是为了生成给定长度的随机字符串。如果raw_output
设置为 false(默认),则输出的“salt”将以与crypt()
. 如果raw_output
为真,它将使用随机全字节 ( 0-255
) 返回相同长度的字符串。
例子:
$hash = password_hash("foo");
if (password_verify("foo", $hash)) {
// always should be true
} else {
}
阅读 PHP 源代码的注意事项:PHP 函数(暴露于 php 代码的函数)被PHP_FUNCTION()
宏包围。此外,php 变量(zval's)在一些地方被使用。访问其中一部分的宏是
Z_TYPE_P()
(查找指向 zval 的指针的类型)Z_STRVAL_P()
(获取指向字符串值的指针)Z_STRLEN_P()
(获取int
字符串类型的长度)Z_LVAL_P()
(获取long
整数类型的值)
此外,zval_ptr_dtor()
是一种 refcount 机制,用于减少 a 上的 refcount zval
,并在它命中时将其清除0
。
在正式提出更改之前,我正在寻找至少一些安全专家对实施的审查。它相当短(只有大约 300 行代码)......
更新
API 已获得批准,因此我为该功能设置了拉取请求。如果您有时间,请查看它。谢谢!: https ://github.com/php/php-src/pull/191