如何在Dart中实现与SHA256Encript.php等价的加密逻辑
Dart实现与PHP完全等价的SHA256加密方法
首先修正参数拼接顺序错误
你之前写的Dart代码拼接输入字符串的顺序和PHP原代码不一致,PHP原代码的拼接格式为%s*%s*%s*%s*%s,对应参数顺序是ipAddress -> comercio -> sucursal -> amount -> secretKey,顺序错误会直接导致最终哈希结果完全不匹配。
字节转十六进制逻辑对应关系
你需要实现的PHP循环拼接逻辑,和Dart的API对应关系如下:
- PHP
unpack('C*', hash("sha256", $inputArray, true)):等价于Dart中sha256.convert(utf8.encode(input)).bytes,直接拿到SHA256哈希后的无符号字节数组,不需要额外解包 - PHP
dechex($hashedArray[$i]):等价于Dart中byte.toRadixString(16),将十进制字节值转为十六进制字符串 - PHP
strtolower():Dart的toRadixString(16)默认输出小写十六进制,无需额外转换,如需兼容特殊场景可手动调用.toLowerCase() - PHP
str_pad(..., 2, '0', STR_PAD_LEFT):等价于Dart中对转换后的十六进制字符串调用.padLeft(2, '0'),长度不足2位时在左侧补0
完整可运行代码
首先需要在pubspec.yaml中添加官方crypto依赖(Dart内置库不包含SHA256实现,需要引入官方维护的crypto包):
dependencies: crypto: ^3.0.3
然后实现对应方法:
import 'dart:convert'; import 'package:crypto/crypto.dart'; String generateSign({ required String ipAddress, required String secretKey, required String comercio, required String sucursal, required String amount, }) { // 严格按照PHP顺序拼接输入字符串 final input = "$ipAddress*$comercio*$sucursal*$amount*$secretKey"; final inputBytes = utf8.encode(input); final hashResult = sha256.convert(inputBytes); // 遍历字节转两位补零小写十六进制,拼接结果 return hashResult.bytes .map((byte) => byte.toRadixString(16).padLeft(2, '0')) .join(); }
说明:PHP的
utf8_encode()在输入字符串为ISO-8859-1编码时会转成UTF-8,如果你传入的参数本身是UTF-8编码(绝大多数业务场景都是),和Dart的utf8.encode()行为完全一致,不需要额外编码转换。
内容的提问来源于stack exchange,提问作者Ariel Soriano Vassia
相关产品推荐
相关产品推荐

