signature.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Security.Cryptography;
  5. using System.Text;
  6. namespace ImgProxy.Examples
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. const string Key = "943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881";
  13. const string Salt = "520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5";
  14. var path = SignerHelper.SignPath(Key, Salt, "/rs:fit:300:300/plain/http://img.example.com/pretty/image.jpg");
  15. Console.WriteLine(url);
  16. }
  17. }
  18. public static class SignerHelper
  19. {
  20. public static string SignPath(string key, string salt, string path)
  21. {
  22. var keybin = HexadecimalStringToByteArray(key);
  23. var saltBin = HexadecimalStringToByteArray(salt);
  24. var passwordWithSaltBytes = new List<byte>();
  25. passwordWithSaltBytes.AddRange(saltBin);
  26. passwordWithSaltBytes.AddRange(Encoding.UTF8.GetBytes(path));
  27. using var hmac = new HMACSHA256(keybin);
  28. byte[] digestBytes = hmac.ComputeHash(passwordWithSaltBytes.ToArray());
  29. var urlSafeBase64 = EncodeBase64URLSafeString(digestBytes);
  30. return $"/{urlSafeBase64}{path}";
  31. }
  32. static byte[] HexadecimalStringToByteArray(string input)
  33. {
  34. var outputLength = input.Length / 2;
  35. var output = new byte[outputLength];
  36. using (var sr = new StringReader(input))
  37. {
  38. for (var i = 0; i < outputLength; i++)
  39. output[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
  40. }
  41. return output;
  42. }
  43. static string EncodeBase64URLSafeString(this byte[] stream)
  44. => Convert.ToBase64String(stream).TrimEnd('=').Replace('+', '-').Replace('/', '_');
  45. static string EncodeBase64URLSafeString(this string str)
  46. => EncodeBase64URLSafeString(Encoding.UTF8.GetBytes(str));
  47. }
  48. }