首页 新闻 会员 周边 捐助

postmain

0
悬赏园豆:5 [已解决问题] 解决于 2022-07-01 06:34
 CryptoJS.enc.Utf8.parse()
CryptoJS.MD5
这两个在postmain脚本中是什么意思
 在java程序中有没有替代的方法
sunny-JJ的主页 sunny-JJ | 初学一级 | 园豆:-3
提问于:2022-06-30 16:37
< >
分享
最佳答案
1

一、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>
收获园豆:5
飒沓流星 | 小虾三级 |园豆:1099 | 2022-06-30 17:06

哇,太感谢你了🐂🍺

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 06:33

@sunny-JJ: 客气客气,相互学习

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 12:55

@飒沓流星: 我又试了一下,然后又咨询了一下,好像不太对,CryptoJS.enc.Utf8.parse这个方法是转为utf-8的字符集类型的,能加下您微信或qq么,想跟您一起讨论学习下

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 17:12

@sunny-JJ:
抱歉,是我之前写错了:
一、CryptoJS.enc.Utf8.parse 是 解析为UTF8字节数组 方法

byte[] bytes = "字符串".getBytes(StandardCharsets.UTF_8);

二、CryptoJS.enc.Base64.parse 才是 Base64转码 方法

参考链接:https://zhuanlan.zhihu.com/p/146098209

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 17:30

@飒沓流星: 

 

 大佬能帮忙看看就这个东西,在请求头中写的,主要是signature这个参数实在是不清楚改怎么在java中写出一样的来,搞得每次接口都调不通

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 18:00

@sunny-JJ:
就是字符串拼接呀(Java里用+就行了),拼接后完整的字符串再取MD5码

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 18:22

@飒沓流星: 主要是他一直报错就这个东西错误,搞得我不自信了😂

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 21:46

@sunny-JJ:
那你把错误发出来,一起看下

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 21:47

@飒沓流星: 

 

 

 

 这就是一些主要的东西

 

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 21:56

@sunny-JJ: 

 

 这个就是一个解释

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 22:02

@sunny-JJ:
这怎么看问题哦。。。

猜测应该是你计算的MD5签名和这个方法中的签名校验不一致,你看下这个方法里签名的计算逻辑,或者直接DEBUG一下

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 22:03

@sunny-JJ:
你把 MD5散列 改成 SM3,再试试

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 22:04

@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() {}
}
飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 22:06

@飒沓流星: 这里是写的ms3但接口要求就是MD5,这个感保证没问题

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 22:06

@sunny-JJ:
那你就看看doPostHead方法的逻辑是怎么样的?哪里导致的它校验不一致

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 22:07

@飒沓流星: 

 

 会不会是body的问题,他的话我是直接将他以map形式放到请求体中去了

 

 就像是这种

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 22:09

@sunny-JJ:
跟body有什么关系?现在是签名不一致,你得找到是哪里不一致。。。
看是哪里校验的签名

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 22:11

@sunny-JJ: 要不加个微信聊方便点,向日葵远程看也行

sunny-JJ | 园豆:-3 (初学一级) | 2022-07-01 22:12

@飒沓流星: 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 | 园豆:-3 (初学一级) | 2022-07-01 22:14

@sunny-JJ:
签名不是在这里校验的,这个方法只是发送请求,你Debug调试一下

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-01 23:03

@sunny-JJ:

就是这个错误是在哪里报出来的,这个你得自己调试一下

飒沓流星 | 园豆:1099 (小虾三级) | 2022-07-02 13:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册