如何在颤振(飞镖)应用程序和 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 密码保存/检查?的主要内容,如果未能解决你的问题,请参考以下文章

颤振/飞镖:如何在飞镖 FFI 中使用异步回调?

如何在 Xcode macosx 中安装颤振和飞镖?

构建颤振项目时如何将飞镖和颤振设置为默认值

如何使用颤振和飞镖从 Cloud Firestore 检索特定数据?

如何取消颤振/飞镖集团中的“等待”

如何根据 dateTIme 和 TimeOfDay 对颤振/飞镖中的列表项进行排序?