signature.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  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. const string Url = "http://img.example.com/pretty/image.jpg";
  15. const string Resize = "fill";
  16. const int Width = 300;
  17. const int Height = 300;
  18. const string Gravity = "no";
  19. const int Enlarge = 1;
  20. const string Extension = "png";
  21. var url = GenerateUrl(Key, Salt, Url, Resize, Width, Height, Gravity, Enlarge, Extension);
  22. Console.WriteLine(url);
  23. }
  24. static string GenerateUrl(string key, string salt, string url, string resize, int width, int height, string gravity, int enlarge, string extension)
  25. {
  26. var keybin = StringToByteArray(key);
  27. var saltBin = StringToByteArray(salt);
  28. var encodedUrl = string.Join("/", WholeChunks(Convert.ToBase64String(Encoding.UTF8.GetBytes(url)).TrimEnd('='), 16));
  29. var path = $"/{resize}/{width}/{height}/{gravity}/{enlarge}/{encodedUrl}.{extension}";
  30. using (var hmac = new HMACSHA256(keybin))
  31. {
  32. var hash = hmac.ComputeHash(saltBin.Concat(Encoding.UTF8.GetBytes(path)).ToArray());
  33. return $"/{Convert.ToBase64String(hash).TrimEnd('=')}{path}";
  34. }
  35. }
  36. static byte[] StringToByteArray(string hex)
  37. {
  38. return Enumerable.Range(0, hex.Length)
  39. .Where(x => x % 2 == 0)
  40. .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
  41. .ToArray();
  42. }
  43. static IEnumerable<string> WholeChunks(string str, int maxChunkSize)
  44. {
  45. for (int i = 0; i < str.Length; i += maxChunkSize)
  46. yield return str.Substring(i, Math.Min(maxChunkSize, str.Length - i));
  47. }
  48. }
  49. }