using System.Security.Cryptography; using System.Text; namespace Halo.Core.Auth; /// Erzeugt und verfingert Geheimnisse, die Clients vorzeigen. /// /// /// Abgelegt wird nur der Fingerabdruck, nie das Geheimnis. Wer die /// Datenbank erbeutet, hat damit Hashes und keine Zugänge. Dass das überhaupt /// erwähnt werden muss: bei Medienservern liegen Token regelmässig im /// Klartext, und ein einziges Datenbankleck gibt dann jedem alles. /// /// SHA-256 ohne Salz und ohne Streckung genügt hier — anders als bei /// Passwörtern. Diese Geheimnisse sind 256 Bit Zufall; sie zu erraten ist /// aussichtslos, ganz gleich wie schnell jemand hashen kann. /// public static class Secrets { private const int Bytes = 32; /// Ein neues Geheimnis, in URL-sicherem Base64. public static string Create() => Base64UrlEncode(RandomNumberGenerator.GetBytes(Bytes)); /// Der Fingerabdruck, wie er in der Datenbank steht. public static string Fingerprint(string secret) => Convert.ToHexStringLower(SHA256.HashData(Encoding.UTF8.GetBytes(secret))); private static string Base64UrlEncode(byte[] roh) => Convert.ToBase64String(roh).TrimEnd('=').Replace('+', '-').Replace('/', '_'); }