关于SHA-256 HMAC 加密的问题

[复制链接]
查看: 504   回复: 9
发表于 2021-9-21 16:51:17 | 显示全部楼层 |阅读模式
比如key是111
内容是https://imagedelivery.net/SzNV43bIOhJnWJ5Iz6Cvhg/932c3295-9ef0-43c0-45cf-082dd1d6ed01/public?exp=1632165833
加密后得到的值是1d160cf8c35752b652a3d5fc542634560e7a990091ea1073cd6fb42822f5a349。  就是正确的

但是我c# 得到的是4090da18a78252c31e4e43dbb89ec78e79a8d7db3199285ac1204c7043819eab
下面代码有什么问题吗。
  public static string Encrypt(string message, string secret)
        {

            var encoding = new System.Text.UTF8Encoding();
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] messageBytes = encoding.GetBytes(message);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                StringBuilder builder = new StringBuilder();
                for (int i = 0; i < hashmessage.Length; i++)
                {
                    builder.Append(hashmessage.ToString("x2"));
                }
                return builder.ToString();
            }
        }
回复

使用道具 举报

 楼主| 发表于 2021-9-21 16:51:35 | 显示全部楼层
HMAC SHA256 你没算错
然而,你应该是没弄对具体算法。

关于SHA-256 HMAC 加密的问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 16:52:05 | 显示全部楼层
啊。大佬。能给指点下么。可能关键点在下面的代码,不明白作用。
const key = await crypto.subtle.importKey(
    "raw",
    secretKeyData,
    { name: "HMAC", hash: "SHA-256" },
    false,
    ["sign"]
  );

https://developers.cloudflare.com/images/serving-images/serving-private-images-using-signed-url-tokens
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 16:52:25 | 显示全部楼层
我不懂Web Crypto API,我用我一般的编程理解来说,抛砖引玉,错了别怪我。
你的代码我不看了,我只说CF的代码。

这段是根据你的KEY生成key(注意大小写不同),算法是 HMAC-SHA256,请注意,这个key是用于链接签名的。

  const secretKeyData = encoder.encode(KEY);
  const key = await crypto.subtle.importKey(
    "raw",
    secretKeyData,
    { name: "HMAC", hash: "SHA-256" },
    false,
    ["sign"]
  );

下面这段,只使用HMAC算法, key为上面生成的,然后为链接生成了签名。其实标准HMAC算法里,应该有一个加密方式,这里没有,我猜是crypto api有个默认的算法,比如SHA1。

  const mac = await crypto.subtle.sign(
    "HMAC",
    key,
    encoder.encode(stringToSign)

所以,你把KEY直接拿来链接这里(下面这段)做HMAC SHA256是不对的。

总结:
1. 用你的KEY,做SHA256 HMAC,得到链接加密密钥key
2. 用key,对链接做HMAC。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 16:53:24 | 显示全部楼层
这个斌斌就是逊啦
回复 支持 反对

使用道具 举报

发表于 2021-9-21 16:53:49 | 显示全部楼层
这么快就用上CF的图床啦?请问下它的图片可以分组吗?有层级结构吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 16:54:15 | 显示全部楼层
两次处理加密代码不一样,就是不明白第一次对key 的处理
回复 支持 反对

使用道具 举报

发表于 2021-9-21 16:54:25 | 显示全部楼层
第一次是生成key,通过KEY做HMAC SHA256,弄到key
第二次是签名,用key,然后做HMAC
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 16:55:17 | 显示全部楼层
第一次和第二次如果都是
HMAC SHA256,那代码不一样好像。就是不明白具体区别

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-21 16:56:09 | 显示全部楼层
第二次不是SHA256呢,第一次才是。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则