Правильно ли я генерирую HMAC(C#)?

Всем привет. Есть задание, в котором мне нужно на основе строки и соли(рандомная 128 битная строка(?)) сгенерировать HMAC, чтобы потом можно было проверить. Я, вроде, все сделал. Вывожу в консоль соль и сам hmac, пытаюсь проверить его правильность во всяких онлайн-генераторах. И, они выдают мне прям совсем не то, что я хочу видеть. Я точно не знаю, в чем проблема, но, мб, в Convert.ToBase64String(bstr)? Вот мой класс для шмаков.

internal class HMACHash
{
    private static byte[] salt;
    private static byte[] hmac;

    public HMACHash(string text, int saltLength = 128)
    {
        salt = GenSalt(saltLength);
        hmac = GenHMAC(text);
    }

    public string GetSalt()
    {
        return Convert.ToBase64String(salt);
    }

    public string GetHMAC()
    {
        return Convert.ToBase64String(hmac);
    }

    private static byte[] GenSalt(int length)
    {
        RNGCryptoServiceProvider crypto = new RNGCryptoServiceProvider();
        var salt = new byte[length];
        crypto.GetBytes(salt);
        return salt;
    }

    private static byte[] GenHMAC(string str)
    {
        var hmac = new HMACSHA256(salt);
        var bstr = Encoding.Default.GetBytes(str);
        hmac.ComputeHash(bstr);
        return bstr;
    }
}

Вывод консоли. В качестве строки передавал "test".

введите сюда описание изображения


Ответы (1 шт):

Автор решения: aepot

Encoding.Default - никогда не используйте Default. На разных компах и операционных системах кодировка по умолчанию может быть разная. Используйте например Encoding.UTF8.

Ну и плюс опечатка есть.

Вот этот метод вам надо поправить:

private static byte[] GenHMAC(string str)
{
    var hmac = new HMACSHA256(salt);
    var bstr = Encoding.UTF8.GetBytes(str);
    return hmac.ComputeHash(bstr);
}

С Convert.ToBase64String(hmac) всё хорошо, ну если вам нужен именно Base64 на выходе, а не HEX. Для получения HEX надо делать Convert.ToHexString(hmac).ToLower()

→ Ссылка