You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 00:15:51