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('/', '_');
}