为了账号安全,请及时绑定邮箱和手机立即绑定

不同编程语言中有关 Hmac SHA256 的问题

不同编程语言中有关 Hmac SHA256 的问题

杨__羊羊 2022-07-20 20:25:17
在尝试将 HMACSHA256(散列)集成到不同的编程语言中时,我遇到了一个问题。我尝试使用 Java 和 C# 中的标准预定义方法来实现标准算法,并且我在不同的语言中得到了不同的结果。请参阅下面我在 Java 和 C# 中的实现:爪哇:    public static String convertSHAWithSalt(String value, String salt)                throws NoSuchAlgorithmException, InvalidKeyException {            String data = "";            try {                MessageDigest md = MessageDigest.getInstance("SHA-256");                md.update(salt.getBytes(StandardCharsets.UTF_8));                byte[] bytes = md.digest(value.getBytes(StandardCharsets.UTF_8));                StringBuilder sb = new StringBuilder();                for (byte b : bytes) {                    sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));                }                data = sb.toString();                System.out.println(data);                } catch (NoSuchAlgorithmException e) {                  e.printStackTrace();               }            }字符串值“abcd”和空盐值的结果:88d4266fd4e6338d13b845fcf289579d209c897823b9217da3e161936f031589C#:       public static string createHash(string message, string secret)        {            byte[] keyByte = System.Text.Encoding.UTF8.GetBytes(secret);            byte[] messageBytes = System.Text.Encoding.UTF8.GetBytes(message);            HMACSHA256  hmacsha256 = new HMACSHA256(keyByte);            byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);            return BitConverter.ToString(hashmessage).Replace("-", "").ToLower();        }字符串值“abcd”和空盐值的结果:527ff4c28c22a090fe39908139363e81b8fb10d0695a135518006abfa21cf5a2
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

和之间有区别。 (另请参见)是一种使用-hash-algorithm 生成 a 的算法。SHA-256HMAC-SHA-256HMAC-SHA-256HMACMACSHA-256

第一个 Java-code 和 C#-code 的结果是不同的,因为 Java-code 使用SHA-256和 C#-code HMAC-SHA-256

由于您想使用HMAC-SHA-256我专注于它,因此我忽略了第一个 Java 代码。

文本的 C# 代码的结果

This is an arbitrary text!

用钥匙

1234567890

25583e6e0b6c2c3a5c50ebd9ea48138a960a7ca2a215fae2b4b82ee99734deb4

第二个 Java 代码HMAC-SHA-256也使用。如果你更换线路

data = bytesToHex(sha256Hmac.doFinal(data.getBytes(StandardCharsets.UTF_8)));System.out.println(data);

data = bytesToHex(sha256Hmac.doFinal(value.getBytes(StandardCharsets.UTF_8)));return data;

然后,输出是相同的(前提是您的(未发布的)bytesToHex-方法以正确的方式工作,请参见例如How to convert a byte array to a hex string in Java?)。

顺便说一句,在第二个 Java 代码中,您应该将标签更改为类似的salt东西,key因为这是 a 上下文中的常用措辞MAC通常与密码散列结合使用,就像在您的第一个 Java 代码中一样。

注意:在 Java 代码中,不允许使用空字节数组作为SecretKeySpec输入。这会抛出一个IllegalArgumentException (Empty key). 但是,HMACSHA256C# 代码中的 -ctor 接受一个空字节数组并在内部用 0 值填充它。因此,关于您的测试用例(文本:abcd,空键),您可以在 Java 代码中通过包含单个 0 值的字节数组来模拟空字节数组。然后,Java 代码的输出等于 C# 代码的输出。当然,空键应该只用于这个测试用例。


查看完整回答
反对 回复 2022-07-20
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号