Правильно ли я генерирую 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 шт):
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()
