Я переношу некоторый код с PHP на .NET (я не разработчик PHP), и все это выглядит довольно просто, за исключением следующей строки:
public function hash($message, $secret) { return base64_encode(hash_hmac('sha1', $message, $secret)); }
Как я могу перенести эту функцию в .NET?
Кодировка base64 выполняется следующим образом, но как я могу реплицировать hash_hmac ()?
Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(tmpString));
Благодаря!
Если вы ищете HMAC, тогда вы должны использовать класс, полученный из [System.Security.Cryptography.HMAC][1]
.
hash_hmac ('sha1', $ message, $ secret)
В этом случае это будет [System.Security.Cryptography.HMACSHA1][2]
.
UPDATE (более простой код, а не ASCII-зависимый)
static string Hash (string message, byte[] secretKey) { using (HMACSHA1 hmac = new HMACSHA1(secretKey)) { return Convert.ToBase64String( hmac.ComputeHash(System.Text.UTF8.GetBytes(message)); } }
Используйте HashAlgorithm
, а именно SHA1CryptoServiceProvider
, например:
byte[] SHA1Hash (byte[] data) { using (var sha1 = new SHA1CryptoServiceProvider()) { return sha1.ComputeHash(data); } }
В итоге мне удалось создать решение на основе класса HMACSHA1:
private string Hash(string message, byte[] secretKey) { byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(message); byte[] hashBytes; using (HMACSHA1 hmac = new HMACSHA1(secretKey)) { hashBytes = hmac.ComputeHash(msgBytes); } var sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) sb.Append(hashBytes[i].ToString("x2")); string hexString = sb.ToString(); byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(hexString); return System.Convert.ToBase64String(toEncodeAsBytes); }
ОБНОВЛЕНО : сжатый код немного – не нужно так много вспомогательных функций.