技术饭
JAVA原生的类实现SHA256加密签名,转换成PHP版本加密
JAVA原生的类实现SHA256加密签名,转换成PHP版本加密签名,注意点主要在sort字典排序的时候需要设置方式为 SORT_STRING,如果sha 256加密函数的第三个参数设置为true时,这时候返回的是二进制数据,默认是false返回的则是进制的字符串。
1、signature 的 生成 JAVA示例代码:
//利用java原生的类实现SHA256加密
String getSHA256(String str) {
MessageDigest messageDigest;
String messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(str.getBytes("UTF-8"));
//将byte转为16进制
encodestr = byte2Hex(messageDigest.digest());
return encodestr;
}
//生成时间戳
Long timestamp = System.currentTimeMillis() / 1000L;
//两个参数进行字典序排序
List<String> paramList = Arrays.asList("${appSecret}", timestamp.toString());
Collections.sort(paramList);
//将两个参数字符串,拼接成一个字符串进行 SHA256 加密
String paramJoinStr = StringUtils.join((String[]) paramList.toArray(), "");
//SHA256 加密
String sha256 = getSHA256(paramJoinStr);
2、signature 的 生成 PHP示例代码:
//组装数据
$signature = [$this->appsecret, time()];
//进行字典排序,不要忘了SORT_STRING
sort($signature, SORT_STRING);
//转成字符串
$signature = implode($signature);
//方法1:sha 256加密
$signature = hash('sha256', $signature);
//方法2:sha 256加密,设置true则是二进制,bin2hex转成16进制
//$signature = bin2hex(hash('sha256', $signature, true));
//返回数据
return $signature;
参考:
https://www.656463.com/wenda/rhzPHPzzxjavaMessageDigestSHA256_454
https://stackoverflow.com/questions/44963287/how-to-reproduce-java-messagedigest-sha-256-hash-in-php
文明上网理性发言!