栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

C#和Java-hmacsha256哈希之间的区别

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#和Java-hmacsha256哈希之间的区别

不要这样做:

byte[] bytes = data.getBytes();

这将使用平台默认编码将字符串转换为字节数组。平台之间可能会有所不同,而您想要一些可重复的东西。我建议使用UTF-8:

byte[] bytes = data.getBytes("UTF-8");

(当然,对密钥执行相同的操作。)

然后,您应该在C#中使用相同的编码- 而不是 ASCII,除非您确实不想处理非ASCII字符。

byte[] bytes = Encoding.UTF8.GetBytes(data);

还不清楚您随后如何比较结果-别忘

byte
了Java 中已签名,而C#中未签名。为了进行比较,将哈希转换为十六进制或base64可能是最简单的。

编辑:我强烈怀疑最后一部分是问题-比较结果。

这是两个简短但完整的程序(使用Java中的iharder.net base64转换器),它们产生相同的base64输出:

Java:

import java.util.*;import javax.crypto.*;import javax.crypto.spec.*;public class Test {    public static void main (String[] args) throws Exception {        String secretAccessKey = "mykey";        String data = "my data";        byte[] secretKey = secretAccessKey.getBytes();        SecretKeySpec signingKey = new SecretKeySpec(secretKey, "HmacSHA256");        Mac mac = Mac.getInstance("HmacSHA256");        mac.init(signingKey);        byte[] bytes = data.getBytes();        byte[] rawHmac = mac.doFinal(bytes);        System.out.println(base64.enpreBytes(rawHmac));    }}

C#:

using System;using System.Security.Cryptography;using System.Text;class Test{    static void Main()    {        String secretAccessKey = "mykey";        String data = "my data";        byte[] secretKey = Encoding.UTF8.GetBytes(secretAccessKey);        HMACSHA256 hmac = new HMACSHA256(secretKey);        hmac.Initialize();        byte[] bytes = Encoding.UTF8.GetBytes(data);        byte[] rawHmac = hmac.ComputeHash(bytes);        Console.WriteLine(Convert.Tobase64String(rawHmac));    }}

两者的输出:

ivEyFpkagEoghGnTw/LmfhDOsiNbcnEON50mFGzW9/w=


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/497940.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号