Delphi 11.3 FMX中是否有等价于PHP password_verify的函数?
在Delphi 11.3 FMX中验证PHP password_hash()生成的哈希密码
Delphi 11.3 FMX本身没有内置与PHP password_verify()功能完全一致的函数,但可以通过纯Pascal实现的跨平台BCrypt库达成需求——因为PHP的password_hash(PASSWORD_DEFAULT)默认采用BCrypt算法(哈希前缀为$2y$,与标准BCrypt的$2b$验证逻辑完全兼容)。
实现方案
- 选用跨平台BCrypt库:挑选纯Pascal编写的BCrypt实现(仅依赖RTL函数,不绑定VCL组件),这类库可直接在FMX项目中编译运行。
- 适配PHP哈希前缀:PHP的
$2y$是BCrypt的变种,验证逻辑与标准$2b$一致,只需将哈希中的$2y$替换为$2b$即可正常验证。
代码示例
function VerifyPHPPassword(const Password, Hash: string): Boolean; var AdjustedHash: string; begin // 替换PHP特有的$2y$前缀为标准BCrypt的$2b$ AdjustedHash := StringReplace(Hash, '$2y$', '$2b$', [rfReplaceAll]); // 调用跨平台BCrypt库的验证函数 Result := BCrypt.CheckPassword(Password, AdjustedHash); end; // 测试验证逻辑 var TestPassword: string; TestHash: string; begin TestPassword := 'thisismyaccesscode'; TestHash := '$2y$10$21qire0Qwz/gj6HEej3tf.skdiZzeB.rgFdg7qD.5rAhE/AFg.U8q'; if VerifyPHPPassword(TestPassword, TestHash) then ShowMessage('密码验证通过') else ShowMessage('密码验证失败'); end;
注意事项
- 确保所选BCrypt库支持处理
$2b$前缀的哈希值,绝大多数纯Pascal实现都兼容该标准格式。 - 前缀替换仅用于适配验证逻辑,无需修改PHP生成的原始哈希,不会影响验证结果的准确性。
内容的提问来源于stack exchange,提问作者M Eugene
相关产品推荐
相关产品推荐

