一、CryptoJS.enc.Utf8.parse 是 Base64转码 方法
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class Main {
public static void main(String[] args) {
// Base64转码
Base64.Encoder encoder = Base64.getEncoder();
byte[] encode = encoder.encode("123".getBytes(StandardCharsets.UTF_8));
// Base64解码
Base64.Decoder decoder = Base64.getDecoder();
byte[] decode = decoder.decode(encode);
System.out.println(new String(decode, StandardCharsets.UTF_8));
}
}
二、CryptoJS.MD5 是 转MD5码 方法
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
public class MD5Util {
/**
* 生成MD5摘要[32位十六进制,全大写]
* @param bytes 字节数组
* @return MD5值
*/
public static String md5(byte[] bytes) {
MD5Digest digest = new MD5Digest();
digest.update(bytes, 0, bytes.length);
byte[] md5 = new byte[digest.getDigestSize()];
digest.doFinal(md5, 0);
return ByteUtils.toHexString(md5).toUpperCase();
}
private MD5Util() {}
}
pom.xml 依赖包
<!-- bcpg-jdk15on -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk15on</artifactId>
<version>1.70</version>
</dependency>
哇,太感谢你了🐂🍺
@sunny-JJ: 客气客气,相互学习
@飒沓流星: 我又试了一下,然后又咨询了一下,好像不太对,CryptoJS.enc.Utf8.parse这个方法是转为utf-8的字符集类型的,能加下您微信或qq么,想跟您一起讨论学习下
@sunny-JJ:
抱歉,是我之前写错了:
一、CryptoJS.enc.Utf8.parse 是 解析为UTF8字节数组 方法
byte[] bytes = "字符串".getBytes(StandardCharsets.UTF_8);
二、CryptoJS.enc.Base64.parse 才是 Base64转码 方法
@飒沓流星:
大佬能帮忙看看就这个东西,在请求头中写的,主要是signature这个参数实在是不清楚改怎么在java中写出一样的来,搞得每次接口都调不通
@sunny-JJ:
就是字符串拼接呀(Java里用+
就行了),拼接后完整的字符串再取MD5码
@飒沓流星: 主要是他一直报错就这个东西错误,搞得我不自信了😂
@sunny-JJ:
那你把错误发出来,一起看下
@飒沓流星:
这就是一些主要的东西
@sunny-JJ:
这个就是一个解释
@sunny-JJ:
这怎么看问题哦。。。
猜测应该是你计算的MD5签名和这个方法中的签名校验不一致,你看下这个方法里签名的计算逻辑,或者直接DEBUG一下
@sunny-JJ:
你把 MD5散列 改成 SM3,再试试
@sunny-JJ:
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.Objects;
/**
* SM3工具类
*/
public class SM3Util {
static {
if ( Objects.isNull(Security.getProvider(BouncyCastleProvider.PROVIDER_NAME)) ){
Security.addProvider(new BouncyCastleProvider());
}
}
/**
* 加密
* @param value 待加密字符串
* @return 返回64位(256/4)十六进制字符串
*/
public static String encrypt(String value) {
byte[] src = value.getBytes(StandardCharsets.UTF_8);
byte[] srcHash = hash(src);
return ByteUtils.toHexString(srcHash);
}
/**
* 生成对应的hash值
* @return 返回长度为32的byte数组
*/
public static byte[] hash(byte[] src) {
SM3Digest digest = new SM3Digest();
digest.update(src, 0, src.length);
byte[] hash = new byte[digest.getDigestSize()];
digest.doFinal(hash, 0);
return hash;
}
private SM3Util() {}
}
@飒沓流星: 这里是写的ms3但接口要求就是MD5,这个感保证没问题
@sunny-JJ:
那你就看看doPostHead
方法的逻辑是怎么样的?哪里导致的它校验不一致
@飒沓流星:
会不会是body的问题,他的话我是直接将他以map形式放到请求体中去了
就像是这种
@sunny-JJ:
跟body有什么关系?现在是签名不一致,你得找到是哪里不一致。。。
看是哪里校验的签名
@sunny-JJ: 要不加个微信聊方便点,向日葵远程看也行
@飒沓流星: public static String doPostSetHead(String url, Map<String, Object> headerParams, Map<String, Object> bodyParams) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost post = new HttpPost(url);
RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(35000)// 设置连接主机服务超时时间
.setConnectionRequestTimeout(35000)// 设置连接请求超时时间
.setSocketTimeout(60000)// 设置读取数据连接超时时间
.build();
post.setConfig(requestConfig);
if (headerParams != null) {
//设置请求头
for (Map.Entry<String, Object> entry : headerParams.entrySet()) {
post.setHeader(entry.getKey(), entry.getValue().toString());
}
}
if (bodyParams != null) {
//设置请求体
List<NameValuePair> list = new ArrayList<>();
for (Map.Entry<String, Object> entry : bodyParams.entrySet()) {
list.add(new BasicNameValuePair(entry.getKey(), (String) entry.getValue()));
}
// 构造from表单对象
UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(list, "UTF-8");
// 把表单放到post里
post.setEntity(urlEncodedFormEntity);
}
CloseableHttpResponse response = httpClient.execute(post);
String resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
return resultString;
}这个是一个工具类
@sunny-JJ:
签名不是在这里校验的,这个方法只是发送请求,你Debug调试一下
@sunny-JJ:
就是这个错误是在哪里报出来的,这个你得自己调试一下