2022-02-03 15:26:44 +00:00
|
|
|
namespace ASC.Common.Utils;
|
|
|
|
|
|
|
|
[Singletone]
|
|
|
|
public class Signature
|
2019-05-17 11:58:09 +00:00
|
|
|
{
|
2022-02-03 15:26:44 +00:00
|
|
|
private readonly MachinePseudoKeys _machinePseudoKeys;
|
2019-10-09 15:04:46 +00:00
|
|
|
|
2022-02-08 11:07:28 +00:00
|
|
|
public Signature(MachinePseudoKeys machinePseudoKeys)
|
|
|
|
{
|
|
|
|
_machinePseudoKeys = machinePseudoKeys;
|
|
|
|
}
|
2019-10-09 15:04:46 +00:00
|
|
|
|
2022-02-08 11:07:28 +00:00
|
|
|
public string Create<T>(T obj)
|
|
|
|
{
|
|
|
|
return Create(obj, Encoding.UTF8.GetString(_machinePseudoKeys.GetMachineConstant()));
|
|
|
|
}
|
2019-05-17 11:58:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public static string Create<T>(T obj, string secret)
|
|
|
|
{
|
|
|
|
var str = JsonConvert.SerializeObject(obj);
|
|
|
|
var payload = GetHashBase64(str + secret) + "?" + str;
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
return WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(payload));
|
|
|
|
}
|
2019-05-17 11:58:09 +00:00
|
|
|
|
2022-02-08 11:07:28 +00:00
|
|
|
public T Read<T>(string signature)
|
|
|
|
{
|
|
|
|
return Read<T>(signature, Encoding.UTF8.GetString(_machinePseudoKeys.GetMachineConstant()));
|
|
|
|
}
|
2019-05-17 11:58:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
public static T Read<T>(string signature, string secret)
|
|
|
|
{
|
|
|
|
try
|
2019-05-17 11:58:09 +00:00
|
|
|
{
|
2022-02-03 15:26:44 +00:00
|
|
|
var rightSignature = signature.Replace("\"", "");
|
|
|
|
var payloadParts = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(rightSignature)).Split('?');
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
if (GetHashBase64(payloadParts[1] + secret) == payloadParts[0])
|
2022-02-08 11:07:28 +00:00
|
|
|
{
|
2022-02-03 15:26:44 +00:00
|
|
|
return JsonConvert.DeserializeObject<T>(payloadParts[1]); //Sig correct
|
2022-02-08 11:07:28 +00:00
|
|
|
}
|
2019-05-17 11:58:09 +00:00
|
|
|
}
|
2022-02-03 15:26:44 +00:00
|
|
|
catch (Exception) { }
|
2019-05-17 11:58:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
return default;
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
private static string GetHashBase64(string str)
|
|
|
|
{
|
|
|
|
using var sha256 = SHA256.Create();
|
2019-05-17 11:58:09 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
return Convert.ToBase64String(sha256.ComputeHash(Encoding.UTF8.GetBytes(str)));
|
|
|
|
}
|
2022-02-01 14:51:29 +00:00
|
|
|
|
2022-02-03 15:26:44 +00:00
|
|
|
private static string GetHashBase64MD5(string str)
|
|
|
|
{
|
|
|
|
using var md5 = MD5.Create();
|
|
|
|
|
|
|
|
return Convert.ToBase64String(md5.ComputeHash(Encoding.UTF8.GetBytes(str)));
|
2019-05-17 11:58:09 +00:00
|
|
|
}
|
2022-02-03 15:26:44 +00:00
|
|
|
}
|