全球主机交流论坛

标题: cf图床代码问题请教,签名 [打印本页]

作者: 斌斌    时间: 2021-9-18 14:57
标题: cf图床代码问题请教,签名
https://developers.cloudflare.com/images/serving-images/serving-private-images-using-signed-url-tokens

有大佬有现成的C# 的么。
或下面这怎么翻译C#的
const encoder = new TextEncoder();
  const secretKeyData = encoder.encode(KEY);
  const key = await crypto.subtle.importKey(
    "raw",
    secretKeyData,
    { name: "HMAC", hash: "SHA-256" },
    false,
    ["sign"]
  );
作者: 滴滴单车    时间: 2021-9-18 15:00
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hmacsha256
作者: 斌斌    时间: 2021-9-18 15:07
滴滴单车 发表于 2021-9-18 15:00
https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hmacsha256

sha256 会了,主要没看懂他这个逻辑。
这是啥语言的代码,nodejs么。
const encoder = new TextEncoder();
  const secretKeyData = encoder.encode(KEY);
比如不明白encoder.encode 是url 编码么?
url.searchParams.set 是做什么的没明白。
作者: 滴滴单车    时间: 2021-9-18 15:12
斌斌 发表于 2021-9-18 15:07
sha256 会了,主要没看懂他这个逻辑。
这是啥语言的代码,nodejs么。
const encoder = new TextEncoder() ...

https://developer.mozilla.org/zh-CN/docs/Web/API/TextEncoder

new TextEncoder().encode() 简单点就 Encoding.UTF8.GetBytes()

url.searchParams 是 https://docs.microsoft.com/en-us/dotnet/api/system.uri.query
作者: 斌斌    时间: 2021-9-18 15:30
滴滴单车 发表于 2021-9-18 15:12
https://developer.mozilla.org/zh-CN/docs/Web/API/TextEncoder

new TextEncoder().encode() 简单点就  ...

     string KEY = "11111111";
            int EXPIRATION = 60 * 60 * 24;
            int ex = (int)Math.Floor((double)(GetTimeStamp(DateTime.Now) / 1000)) + EXPIRATION;
            string url = "https:/imagedelivery.net?key="+ex;
            
            var sha256 = new SHA256Managed();
            var Asc = new UTF8Encoding();
            var tmpByte = Asc.GetBytes(KEY);
            var bufferToHex = sha256.ComputeHash(tmpByte);
            sha256.Clear();
只会到这了,求大佬指点。
作者: 滴滴单车    时间: 2021-9-18 16:24
本帖最后由 滴滴单车 于 2021-9-20 13:30 编辑
  1.         const string KEY = "YOUR_KEY_FROM_IMAGES_DASHBOARD";
  2.         const int EXPIRATION = 60 * 60 * 24; // 1 day

  3.         string generateSignedUrl(string url)
  4.         {
  5.             // `url` is a full imagedelivery.net URL
  6.             // e.g. https://imagedelivery.net/cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile

  7.             var key = Encoding.UTF8.GetBytes(KEY);
  8.             using var hmac = new HMACSHA256(key);

  9.             // Attach the expiration value to the `url`
  10.             var expiry = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + EXPIRATION;
  11.             // `url` now looks like
  12.             // https://imagedelivery.net/cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile?exp=1631289275

  13.             var stringToSign = $"{new Uri(url).AbsolutePath}?exp={expiry}";
  14.             // e.g. /cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile?exp=1631289275

  15.             // Generate the signature
  16.             var mac = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
  17.             var sig = Convert.ToHexString(mac).ToLower();

  18.             // And attach it to the `url`
  19.             return $"{url}?exp={expiry}&sig={sig}";
  20.         }
复制代码

作者: 斌斌    时间: 2021-9-19 01:38
滴滴单车 发表于 2021-9-18 16:24

大佬,net core3 没有ToHexString
我改成 var sig =  BitConverter.ToString(mac);
           sig = sig.Replace("-", "");
        
应该一样吧。
最后得到的签名格式如下。对么。
sig=3346494CFA9CF00D67B8F004C4927DE8E174E3DEC3895977E9273EF641F943AD

好像有另一个文档。上传图片的。
https://api.cloudflare.com/#cloudflare-images-update-image

用httpclient 上传文件成功,好像不能传递可选参数。求助大佬。
作者: 斌斌    时间: 2021-9-19 23:36
滴滴单车 发表于 2021-9-18 16:24

url 格式是这样。好像不太对。
// `url` now looks like
  // https://imagedelivery.net/cheeW4oKsx5ljh8e8BoL2A/bc27a117-9509-446b-8c69-c81bfeac0a01/mobile?exp=1631289275

作者: 斌斌    时间: 2021-9-20 03:30
滴滴单车 发表于 2021-9-18 16:24

加密的值和官方的不一样,设置同样的key和内容加密测试的。可能c# 写的算法不一样
作者: 滴滴单车    时间: 2021-9-20 11:21
斌斌 发表于 2021-9-20 03:30
加密的值和官方的不一样,设置同样的key和内容加密测试的。可能c# 写的算法不一样 ...

我没绑卡 所以没法测试 stringToSign 应该是不带域名和协议的 之前看漏了 现在改了 顺便将 sign 也给转小写了 应该没啥问题
作者: 斌斌    时间: 2021-9-20 12:23
滴滴单车 发表于 2021-9-20 11:21
我没绑卡 所以没法测试 stringToSign 应该是不带域名和协议的 之前看漏了 现在改了 顺便将 sign 也给转小 ...

测试了,不一样,官方不是给worker例子了么,输入一样参数,两个结果不一样
作者: 斌斌    时间: 2021-9-20 12:31
滴滴单车 发表于 2021-9-20 11:21
我没绑卡 所以没法测试 stringToSign 应该是不带域名和协议的 之前看漏了 现在改了 顺便将 sign 也给转小 ...

我运行官方的例子,输入对的密钥和网址,可以访问图片,所以把key 改成了111测试,时间啥的也固定写死和c#测试,得到的结果不一样,可能关键点是key 的处理不一样吧
作者: 滴滴单车    时间: 2021-9-20 13:33
斌斌 发表于 2021-9-20 12:31
我运行官方的例子,输入对的密钥和网址,可以访问图片,所以把key 改成了111测试,时间啥的也固定写死和c ...

没实测还是太容易写Bug了 最后结果用了原 url 来拼 忘了给补上 exp 参数 sign 应该是没算错的 刚测试了下结果一样 也给修正回原楼层了
作者: 斌斌    时间: 2021-9-20 15:12
滴滴单车 发表于 2021-9-20 13:33
没实测还是太容易写Bug了 最后结果用了原 url 来拼 忘了给补上 exp 参数 sign 应该是没算错的 刚测试了下 ...

return stringToSign + "&sig=" + sig;

不应该吧,我早就改成了这样。好像结果不一样。
作者: 斌斌    时间: 2021-9-20 15:13
滴滴单车 发表于 2021-9-20 13:33
没实测还是太容易写Bug了 最后结果用了原 url 来拼 忘了给补上 exp 参数 sign 应该是没算错的 刚测试了下 ...


比如key是111
内容是https://imagedelivery.net/SzNV43bIOhJnWJ5Iz6Cvhg/932c3295-9ef0-43c0-45cf-082dd1d6ed01/public?exp=1632165833
加密后得到的值是1d160cf8c35752b652a3d5fc542634560e7a990091ea1073cd6fb42822f5a349。  就是正确的

但是我c# 得到的是4090da18a78252c31e4e43dbb89ec78e79a8d7db3199285ac1204c7043819eab


https://443502.xyz/forum.php?mo ... ;page=1#pid11015324
作者: 斌斌    时间: 2021-9-20 15:19
滴滴单车 发表于 2021-9-20 13:33
没实测还是太容易写Bug了 最后结果用了原 url 来拼 忘了给补上 exp 参数 sign 应该是没算错的 刚测试了下 ...

Key好像是做了处理变成key了
如果都是 HMAC SHA256 的话,那代码不一样好像。就是不明白具体区别,咱这应该是没处理下面的代码
const key = await crypto.subtle.importKey(
    "raw",
    secretKeyData,
    { name: "HMAC", hash: "SHA-256" },
    false,
    ["sign"]
  );



作者: 斌斌    时间: 2021-9-20 15:39
滴滴单车 发表于 2021-9-20 13:33
没实测还是太容易写Bug了 最后结果用了原 url 来拼 忘了给补上 exp 参数 sign 应该是没算错的 刚测试了下 ...

         下面代码没毛病吧。加密的就是不对呢。
   string url =  generateSignedUrl("https://imagedelivery.net/SzNV43bIOhJnWJ5Iz6Cvhg/932c3295-9ef0-43c0-45cf-082dd1d6ed01/public");


       static string generateSignedUrl(string url)
        {
        
        // var key = SHA256EncryptString(KEY);
          var key = System.Text.Encoding.UTF8.GetBytes(KEY);

              var hmac = new HMACSHA256(key);

             var expiry = DateTimeOffset.UtcNow.ToUnixTimeSeconds() + EXPIRATION;
           
             var stringToSign = $"{url}?exp={expiry}";
           // var stringToSign = url;
            var mac = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
             var sig = BitConverter.ToString(mac);
          sig = sig.Replace("-", "").ToLower();
            return stringToSign + "&sig=" + sig;
        }

作者: 滴滴单车    时间: 2021-9-20 15:54
上次回复后的代码我没有任何改动 套用你另一个贴的示例 下面给个演示

https://dotnetfiddle.net/y27mOf
作者: 斌斌    时间: 2021-9-20 16:06
滴滴单车 发表于 2021-9-20 15:54
上次回复后的代码我没有任何改动 套用你另一个贴的示例 下面给个演示

https://dotnetfiddle.net/y27mOf ...

发现问题了大佬,果然大佬。
我这句不一样                        var stringToSign = $"{new Uri(url).AbsolutePath}?exp={expiry}";

我用的全url弄的,您弄的AbsolutePath。所以不一样。真感谢。




欢迎光临 全球主机交流论坛 (https://443502.xyz/) Powered by Discuz! X3.4