Delphi 中相当于PHP的password_verify()函数

kqhtkvqz  于 2023-03-02  发布在  PHP
关注(0)|答案(3)|浏览(128)

Delphi中是否有一个"简单"的函数(使用10.3 Professional),允许我使用PHP中使用password_hash()生成的哈希代码来验证密码?一个与PHP的password_verify($password, $hash)功能相同的函数?
使用PHP的示例:

$hash = password_hash('thisismyaccesscode', PASSWORD_DEFAULT);
// $hash == '$2y$10$21qire0Qwz/gj6HEej3tf.skdiZzeB.rgFdg7qD.5rAhE/AFg.U8q'

现在我在找一个Delphi函数,它能告诉我,输入到程序中的密码是否能通过这个哈希值验证。
背景:我有一个Web服务器的用户记录列表。使用Web服务,我可以从该服务器检索用户的密码散列。我知道它是使用PHP函数password_hash()生成的。我想让我的用户使用网站上的访问代码登录到我的Delphi程序。因此,我从Web服务器获取密码散列,并希望在Delphi程序中本地验证它,而不是将密码上载到服务器并使用PHP进行检查。

wvyml7n5

wvyml7n51#

PHP函数“password_hash()”使用的算法对同一个字符串返回不同的哈希值,因为它们的计算取决于使用的盐和开发人员定义的成本,以及服务器硬件。因此,算法必须在相同的设备上运行,使用相同的盐和参数,才能返回相同的哈希值。
在这种情况下,必须在服务器端进行哈希验证,并且必须在请求中以纯文本形式将密码发送到实现Web服务的服务器以验证密码。您必须使用HTTPS并努力保护传输。
如果服务器是用PHP开发的,则可以使用函数“password_verify()”用于对照“password_hash”生成的散列进行验证().但是如果你的服务器是用 Delphi 开发的,那么没有现成的验证功能,你使用的算法必须使用Delphi端口。然后实现一个验证密码的函数(用存储的哈希值 Package 哈希算法和字符串验证)。

d8tt03nd

d8tt03nd2#

我找到了一个BCrypt Delphi library,它可以满足我的需求,实现起来非常简单:只需将bcrypt.pas添加到uses列表中。
TBCrypt只包含类函数。TBCrypt.CheckPassword完成了我所需要的工作:输入密码和哈希(我了解到,哈希字符串,我在我的问题中显示包含“盐”).我的密码检查是这样的:

PWOK := TBCrypt.CheckPassword(KeyedInPwdString, PWHashStringFromWebDB, BooleanDummy);
wqlqzqxt

wqlqzqxt3#

正如你在文档中看到的,PHP的password_hash返回的字符串有一个格式。如果你的哈希以$2y开始...那么你也可以理解(重新实现)PHP的password_hash函数如下(仍然在PHP中):

$salt = base64_encode($random_string_of_22_characters_in_length);
$salt = str_replace('+', '.', $salt);
$hash = crypt('supers3cretpassword', '$2y$10$'.$salt.'$');

这使您进一步了解 Delphi 移植,因为crypt()是基于标准UNIX DES算法的实现,您可以很容易地找到Delphi实现。快速搜索返回TUnixCrypt,但我确信还有其他实现。从其文档中可以看到:
...它的工作原理与crypt(key, salt) Unix命令完全相同
...这就是你缺少的链接。你只需要从你的服务器的散列中解析salt,然后用它和用户密码生成一个新的散列。
请注意,原始密码可能是在一个不同的字符编码开始,请确保您的密码编码相应或非ascii密码将无法验证。

相关问题