如何在颤振(飞镖)应用程序和 PHP 网站之间使用 SALT+HASH 密码保存/检查?
Posted
技术标签:
【中文标题】如何在颤振(飞镖)应用程序和 PHP 网站之间使用 SALT+HASH 密码保存/检查?【英文标题】:How can I utilise SALT+HASH password saving/checking betwen a flutter(dart) app and a PHP website? 【发布时间】:2021-10-22 04:41:38 【问题描述】:我在我的颤振应用程序中编写了一个盐/哈希密码函数,它使用 PBKDF2 效果很好。这将盐和哈希保存在 mysql 数据库中的单独字段中。我有一个功能可以抓取盐并生成针对用户输入密码的检查 - 到目前为止一切顺利。
我现在正在编写一个使用相同数据库的基于 php 的网站,我希望能够使用相同的用户名:pwd-hash/salt 来登录网站。
我的问题是我在 PHP 中找不到与颤振/飞镖代码相同结果的代码。
我的工作颤振代码使用password_hash 包
var generator = new PBKDF2();
var salt = list.first.strPwdSalt; // this is the salt grabbed from DB
var hash = generator.generateKey(pwd, salt, 1000, 32);
这会输出一个我保存到数据库中的列表,以后比较结果的操作可以正常工作(因为它始终是作为字符串存储在数据库中的列表)
我希望以下 PHP 代码可以使用 hash_pbkdf2 函数工作:
$password = "andy";
$iterations = 1000;
$salt = "wh9wRLd2cZYrdESln1JSzA=="; // Manually grabbed SALT from DB
$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 32);
echo $hash;
这个输出:efeb557dbb1b774333420687411bf8b9
我无法将上面的字符串转换为 List,或者在 Flutter 中对 List 执行任何操作以将其转换为相同的格式。
在谷歌搜索了很多天后,我被困住了,我希望这是一个相当常见的用例??
谢谢
【问题讨论】:
【参考方案1】:您的 Flutter 代码会生成一个包含 32 个数字字符代码的列表。对于您问题中的示例密码和盐,该列表是:
[239, 235, 85, 125, 187, 27, 119, 67, 51, 66, 6, 135, 65, 27, 248, 185, 33, 185, 216, 106, 17, 57, 90, 13, 105, 61, 145, 148, 86, 32, 182, 94]
PHP 的hash_pbkdf2
函数可以生成相同的字符,但你必须告诉它返回二进制结果:
$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 32, true);
(注意最后一个 true
参数)。
此返回的二进制字符串与您在 Flutter 应用中获得的列表的字符串表示形式相匹配,因此这可能已经足以让您与存储在数据库中的字符串值进行匹配。
如果您存储在数据库中的字符串不是原始二进制字符串而是十六进制表示,您可以在 PHP 中通过将结果从hash_pbkdf2
传递到bin2hex
:
$hex = bin2hex($hash);
// efeb557dbb1b774333420687411bf8b921b9d86a11395a0d693d91945620b65e
如果这还不够,并且您需要 PHP 中的数字字符代码数组,您可以遍历二进制字符串并使用 ord
函数从 PHP 字符串构建字符代码数组:
$characters = array();
for ($i=0; $i<strlen($hash); $i++)
$characters[] = ord($hash[$i]);
print_r($characters);
/*
Array
(
[0] => 239
[1] => 235
[2] => 85
[3] => 125
[4] => 187
[5] => 27
[6] => 119
[7] => 67
[8] => 51
[9] => 66
[10] => 6
[11] => 135
[12] => 65
[13] => 27
[14] => 248
[15] => 185
[16] => 33
[17] => 185
[18] => 216
[19] => 106
[20] => 17
[21] => 57
[22] => 90
[23] => 13
[24] => 105
[25] => 61
[26] => 145
[27] => 148
[28] => 86
[29] => 32
[30] => 182
[31] => 94
)
*/
现在$characters
是一个与您在 Flutter 中获得的列表完全匹配的数组。
【讨论】:
感谢您抽出宝贵时间做出如此全面的回应,我可以使用二进制文件(通过稍微更改颤振应用程序中的代码,或使用字符数组。对于阅读本文的其他人,那里是“bin2hash”位中的错字,应该是 bin2hex以上是关于如何在颤振(飞镖)应用程序和 PHP 网站之间使用 SALT+HASH 密码保存/检查?的主要内容,如果未能解决你的问题,请参考以下文章