首页 新闻 会员 周边

关于C# sha1加密与java sha1加密结果不同的解决方案

0
悬赏园豆:20 [已解决问题] 解决于 2024-02-02 09:35

现在是有一个java的接口, 需要用sha1加密参数
我程序是C# 写的, 现在遇到的问题是
C# 对sha1加密的byte是无符号的, 而java的byte是有符号的, 导致有中文存在的时候, C#加密的值与java 不一致,请问大佬们,这个要怎么解决?

百鸟朝凤的主页 百鸟朝凤 | 菜鸟二级 | 园豆:260
提问于:2023-02-27 11:42
< >
分享
最佳答案
0

中文转url编码

百鸟朝凤 | 菜鸟二级 |园豆:260 | 2023-03-21 08:58
其他回答(3)
0

之前遇到过的一个问题不知道是否能提供一些线索

收获园豆:20
dudu | 园豆:30994 (高人七级) | 2023-02-27 11:52

没有,我现在知道原因,但是java代码不能修改,只能在C#中进行修改,但是封装的SHA1类只支持byte,不支持sbyte,不知道该怎么弄了

支持(0) 反对(1) 百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-02-27 11:55

@百鸟朝凤: 你确定不是对中文解码时的编码UTF8/GB2312不同导致的么?

支持(0) 反对(0) John0King | 园豆:202 (菜鸟二级) | 2023-02-27 15:02

@John0King: 不是,又找到对方问了一下。文档里少写了一句,参数值要进行url编码,已经解决了

支持(0) 反对(0) 百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-02-27 15:04
0

使用标准库:可以使用标准的加密库,例如 BouncyCastle,在 C# 和 Java 中都采用该库进行 SHA1 加密,从而保证加密结果一致。
C# 代码示例:

string data = "hello world";
byte[] bytes = Encoding.UTF8.GetBytes(data);
byte[] hash = new Org.BouncyCastle.Crypto.Digests.Sha1Digest().Digest(bytes);
string result = BitConverter.ToString(hash).Replace("-", "");

Java 代码示例:

String data = "hello world";
byte[] bytes = data.getBytes(StandardCharsets.UTF_8);
byte[] hash = new org.bouncycastle.crypto.digests.SHA1Digest().digest(bytes);
String result = DatatypeConverter.printHexBinary(hash);
心若向阳花自开 | 园豆:275 (菜鸟二级) | 2023-03-08 14:51

我们用了一下中文转url编码,就不存在这个问题了

支持(0) 反对(0) 百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-03-09 12:41
0

用sha1来加密参数?你确定吗?sha1是散列加密算法,是不可逆的,你用这个来加密参数服务端怎么解密?

我是满意吖 | 园豆:386 (菜鸟二级) | 2023-03-09 12:18

不用解密,加密的字符串作为一个参数传递过去,对面也做同样的加密,只要一样,就说明参数没有被篡改

支持(0) 反对(0) 百鸟朝凤 | 园豆:260 (菜鸟二级) | 2023-03-09 12:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册