Files
xSaherElmIds/Helpers/XApiKeyHelper.cs
T
2026-10-11 17:38:12 +03:30

109 lines
3.0 KiB
C#

using System;
using System.Text;
using System.Security.Cryptography;
using xIdentityModels.Constants;
using xIdentityHelper;
namespace xIds.Helpers
{
/// <summary>
/// Api Key Generating Helper Class ...
/// </summary>
public static class XApiKeyHelper
{
/// <summary>
/// Compute Hash of Specified Content using SHA256 ...
/// </summary>
/// <param name="plain"></param>
/// <returns></returns>
public static string ComputeHash(string plain)
{
//
using var sha256 = SHA256.Create();
var hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(plain));
var result = BitConverter.ToString(hashBytes)
.Replace("-", "")
.ToLower();
//
return result;
}
/// <summary>
/// Generate an Api Key ...
/// </summary>
/// <returns></returns>
public static (string plainKey, string hash, string prefix) Generate(string keyPrefix)
{
//
// Generate 32 bytes of cryptographically secure random data
var randomBytes = new byte[32];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(randomBytes);
}
//
// Format: xapp_{base64url}
var plainKey = $"{keyPrefix}_{Convert.ToBase64String(randomBytes)
.Replace("+", "-").Replace("/", "_").TrimEnd('=')}";
//
// Compute Hash ...
var hash = ComputeHash(plainKey);
//
// Prefix for quick identification (first 12 chars)
var prefix = plainKey.Substring(0, 16) + "...";
//
return (plainKey, hash, prefix);
}
/// <summary>
/// Verify Generating Api Key ...
/// </summary>
/// <param name="plainKey"></param>
/// <param name="storedHash"></param>
/// <returns></returns>
public static bool Verify(
string plainKey,
string storedHash
)
{
//
var hash = ComputeHash(plainKey);
return hash == storedHash;
}
/// <summary>
/// Retrieve All ApiKey Scopes ...
/// </summary>
/// <returns></returns>
public static XApiKeyScope[] GetXApiKeyScopes()
{
//
return [
XApiKeyScope.Read,
XApiKeyScope.Write,
XApiKeyScope.Manage,
XApiKeyScope.Admin,
];
}
/// <summary>
/// Retrieve All ApiKey Policies ...
/// </summary>
/// <returns></returns>
public static string[] GetXApiKeyPolicies()
{
return [
XPolicies.ApiKeyAccess,
XPolicies.ApiKeyReadAccess,
XPolicies.ApiKeyWriteAccess,
XPolicies.ApiKeyAdminAccess,
XPolicies.ApiKeyManageAccess,
];
}
}
}