Hmac nedir? Nasıl kullanılır?

Ağustos 2012 | Erol Sürmeli, Yazılım Geliştirme Uzmanı
Hash-based message authentication code kelimelerinin kısaltmasından gelir ve genel olarak veri bütünlüğünü sağlamak için kullanılır.
Hmac

Bu algoritma iki parametre ile çalışır, birincisi key dediğimiz sadece sunucu ve istemci tarafından bilinen gizli anahtardır. İkinci parametre ise asıl kriptolayacağımız mesajdır. Kriptolama işleminde ise servis tarafından sağlanan gizli anahtar, şifreleme algoritması(MD5,SHA1 vb.) ve hmac algoritması kullanılarak mesaj bir hash'a dönüştürülür. Sunucuya veriler iletildiğinde sunucu verilere aynı işlemi uygular ve hash'leri kontrol eder. Key parametresi timespan olarak belirlenirse zamana bağlı hash üretilmiş olur veya bu tip benzer yöntemler kullanılarak tek kullanımlık hash üretilebilir.

Bu algoritmayı kendimiz kolaylıkla yazabiliriz ya da kullandığımız programlama dili içerisinde bu kriptolama sınıfı varsa iki satır kod ile Hmac algoritmasını uygulayabiliriz.

Neden HMAC kullanmalıyım?

Hmac genel olarak bir MAC fonksiyonunun tüm özelliklerine sahiptir. Bu demektir ki HMAC gönderici ve alıcı arasındaki veri bütünlüğünü garanti eder. Ayrıca HMAC hesaplanması kolay ve oldukça hızlıdır. Kullanılacak hash algoritmalarına olan güveni de yanına alıp, hızlı ve kompak çalışarak şifreleme işlemlerini gerçekleştirir. Ayrıca HMAC, kullanılacak programlama dili Api,sınıf vb. bir şekilde HMAC algoritmasını içermese bile kolaylıkla yazılarak uygulanabilecek kadar basit. Ayrıca HMAC gönderici ve alıcı haricinde başkası tarafından hesaplanamaz, yani HMAC göndericinin verileri alıcıya teslim ettiğini garanti etmez, göndericideki ve alıcıdaki verilerin birebir olduğunu garanti eder.

Formül:

HMAC (K,M) = H[(K+opad) | | H [(k+ipad) | | M]]

M = Mesaj, H = Kullanılacak hash fonksiyonu(MD5,SHA1 vb.) , K = Gizli anahtar , opad hex(0x36) [ascii olarak "6" karakteri] değerinin tekrarlanmasıyla oluşan byte dizisi, ipad = hex(0x5C)[ascii olarak "\" karakteri] değerinin tekrarlanmasıyla oluşan byte dizisi, | | = birleştirme işlemi , + = XOR operatörü. b (bloksize) bitlerin bloklanacağı büyüklüktür. SHA-1, MD5, RIPEMD-128/160 vb. fonksiyonlarda 64 bit olarak kullanılır.

  1. K(key)'nın uzunluğu b(bloksize)'den büyükse H(hash) algoritması ile şifrelenerek küçültülür.
  2. K'nın uzunluğu b'den küçükse b'ye eşit olana kadar hex(0x00) ile doldurulur.
  3. Yine b'nin uzunluğunda ipad (tamamen hex(0x36) ile doldurularak) ve opad (tamamen hex(0x5C) ile doldurularak) oluşturulur.
  4. K XOR ipad işlemi ile k_ipad oluşturulur.
  5. K XOR opad işlemi ile k_opad oluşturulur.
  6. k_ipad'e M(mesaj)'yi eklenir.
  7. 6.Adım da üretilen akışa H uygulanır.
  8. 7.Adım da oluşturulan hash değerine 5.adımda üretilen k_opad değeri eklenir.
  9. 8.Adımda oluşan ifadeye H uygulanır ve sonuç gönderilir.

Örnek Php fonksiyonu (HMAC MD5 için):

function hmac ($key, $data){

$b = 64; // byte uzunluğu md5 için

if (strlen($key) > $b) {
$key = pack("H*",md5($key));
}
$key = str_pad($key, $b, chr(0x00));
$ipad = str_pad('', $b, chr(0x36));
$opad = str_pad('', $b, chr(0x5c));
$k_ipad = $key ^ $ipad ;
$k_opad = $key ^ $opad;
return md5($k_opad . pack("H*",md5($k_ipad . $data)));
}


Örnek C#:



public static string GenerateHash(string key, string message)
{
System.Text.UTF8Encoding encoding = new UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
HMACMD5 hmacmd5 = new HMACMD5(keyByte);
byte[] messageBytes = encoding.GetBytes(message);
byte[] hashmessage = hmacmd5.ComputeHash(messageBytes);
return ByteToString(hashmessage);
}

private static string ByteToString(byte[] buff) {
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}

İnternet üzerinden araştırırsanız javascriptle yazılmış örneğine bile rahatlıkla erişebilirsiniz. Online olarak Hmac oluşturabileceğiniz sitelerde mevcut.

quickhash.com/ sitesi üzerinden
Algorithm: bölümü kullanılacak hash algoritması,
Input Data: Hmac ile şifreleyeceğiniz mesaj, Use HMAC Method? alanını işaretleyip, HMAC Key: alanına ise gizli anahtarı girip generate diyerek hash oluşturuyorsunuz.