# Mesaj doğrulama kodu
Mesaj doğrulama kodu (kısaca MDK) kriptografi biliminde bir mesajın doğruluğunu kanıtlamak için kullanılan küçük boyutlu bilgilerdir.
Mesaj doğrulama kodu algoritması, (ayrıca anahtarlı (kriptografik) özet fonksiyon olarak da bilinir), girdi olarak gizli anahtar ve doğruluğu ispatlanacak olan herhangi bir uzunlukta mesaj alır. Çıktı olarak Mesaj doğrulama kodu verir. Bu değer mesajın hem veri bütünlüğünü hem de doğruluğunu kontrol etmeyi sağlar. Bu sayede gizli anahtara sahip kişi (doğrulayıcı) gelen mesajda değişiklik olup olmadığını anlayabilir.


## Güvenlik.
MDK fonksiyonları kriptografik özet fonksiyonlara benzemelerine rağmen güvenlik gereksinimleri bakımından farklıdırlar. Bir mesaj doğrulama koduna güvenli denilebilmesi için, kullanılan MDK fonksiyonunun seçilmiş açık mesaj saldırısı altında varoluşsal sahtekarlığa dayanıklı olması gereklidir. Bunun anlamı, eğer saldırı yapan kişi, gizli anahtara sahip ve saldıran kişinin istediği mesajların bu anahtar ile oluşturulmuş bir MDK'sini veren bir Kahinli Turing makinesine sahip olsa bile, bu mesajlardan başka bir mesaja karşılık gelen MDK'yi olası bir zaman dilimi içinde oluşturamamalıdır.
MDK'ları sayısal imzalardan ayıran temel özellik, hem oluşturma hem de doğrulama aşamasında aynı gizli anahtarın kullanılıyor olmasıdır. Bu da, simetrik şifrelemeye benzer şekilde, gönderici ve alıcının iletişimden önce ortak bir gizli anahtar üzerinde anlaşmalarını gerektirir. Aynı özellikten dolayı MDK'lar sayısal imzaların sağladığı inkar edilemezlik özelliğini sağlayamazlar. Çünkü herhangi bir MDK'yı doğrulayabilen bir kişi aynı zamanda herhangi bir mesaj için geçerli bir MDK da oluşturabilir.


## Mesaj bütünlük kodları (MBK).
MBK ve MDK birbirlerine kelime olarak çok benzemelerine rağmen kriptografik olarak farklıdırlar. MDK'nın aksine MBK üretilirken herhangi bir gizli anahtar kullanılmaz. Dolayısıyla MBK ile mesajın bütünlüğü kontrol edilmek istendiğinde, oluşturulan MBK ya şifrelenmeli ya da olası değiştirme müdahalelerine karşı korunmaya alınmalıdır.Aynı MBK üretme algoritmasının kullandıldığı varsayımı altında aynı mesaj için her zaman aynı MBK oluşacaktır. Buna karşı, MDK üretirken kullanılan gizli anahtar ve başlangıç vektörüne bağlı olarak oluşan MDK değişiklik gösterecektir. MBK'lar gizli anahtar kullanmadıkları için MDK'lara göre mesaj bütünlüğünü koruma adına daha zayıftırlar.


## Uygulama.
MDK algoritmaları kriptografik özet fonksiyonlar ya da blok şifreleme algoritmaları kullanılarak oluşturulabilir. özet fonksiyonlar ile oluşturulan algıritmalara örnek olarak HMAC, blok şifreleme kullanılarak oluşturulan algoritmalara ise OMAC, CBC-MAC ve PMAC verilebilir. Buna rağmen, UMAC ve VMAC gibi hızlı MDK üretme algoritmaları evrensel özetlemeye dayalı olarak oluşturulmuştur.


## Standartlar.
MDK algoritmalarını tanımlayan çeşitli standartlar mevcuttur. Bunlardan bazıları:
  - FIPS PUB 113 "Bilgisayar Veri Doğrulunu Kanıtlama", withdrawn in 2002, defines an algorithm based on DES.
  - ISO/IEC 9797-1 "blok şifreleme kullanan mekanizmalar"
  - ISO/IEC 9797-2 "Özel özet fonksiyon kullanan mekanizmalar"
ISO/IEC 9797-1 ve -2 herhangi bir özet fonksiyon ya da blok şifreleme algoritması ve çeşitli parametreler ile kullanılabilecek genel bir model veya algoritma tanımı verir. Bu da paramterelere bağlı olarak daha belirleyici algoritmalar oluşturmayı sağlar. Örneğin FIPS PUB 113 algoritması, ISO/IEC 9797-1 MAC algoritmasına padding metodunun 1 olarak seçilmesi ve DES blok şifreleme algoritmasının kullanılması ile denk olur.


## Örnek.
Bu örnekte, gönderici, mesajına ait MDK oluşturmak için bir MDK algoritması kullanıyor. Oluşan MDK ve mesaj alıcıya gönderiliyor. Alıcı, ulaşan mesajı, sadece gönderici ve kendisinin sahibi olduğu gizli anahtarı ve gönderici ile aynı MDK algoritmasını kullanarak MDK'yı oluşturur. Oluşan bu MDK, göndericiden mesaj ile birlikte gelen MDK değeri ile karşılaştırılır. Eğer iki MDK birbirine eşit ise, alıcı mesajın bütünlüğünden ve doğruluğundan emin olabilir. Aksi halde mesajın yolda değiştirilmiş ya da hasara uğramış olduğu anlar.