Hash'leme ve Mesaj Kimlik Doğrulama

Kriptografik bir hash, herhangi bir miktardaki veriyi kısa, sabit boyutlu bir özete dönüştürür. Aynı girdi her zaman aynı özeti üretir, farklı bir girdi (tek bir bit değişse bile) tamamen farklı bir özet üretir ve seçilen bir özeti üretecek bir girdi bulmanın pratik bir yolu yoktur. Bir mesaj kimlik doğrulama kodu (MAC), bu fikre gizli bir anahtar ekler, böylece özet aynı zamanda verinin anahtara sahip olmayan biri tarafından değiştirilmediğini de kanıtlar.

 

Bu sayfadaki tüm fonksiyonlar TBytes alır ve döndürür, ve sgcCrypto_SHA2, sgcCrypto_Keccak, sgcCrypto_Blake2b, sgcCrypto_Blake2s, sgcCrypto_SipHash, sgcCrypto_HMAC, sgcCrypto_CMAC ve sgcCrypto_Poly1305 içinde bulunur.

 

SHA-2

 

Bugün üretimde kullanılan TLS sertifikalarının, kod imzalamanın ve çoğu protokolün arkasındaki hash ailesi. Belirli bir boyut isteyen özel bir durum olmadıkça SHA-256 kullanın.

 


function sgcSHA1(const aData: TBytes): TBytes;
function sgcSHA224(const aData: TBytes): TBytes;
function sgcSHA256(const aData: TBytes): TBytes;
function sgcSHA384(const aData: TBytes): TBytes;
function sgcSHA512(const aData: TBytes): TBytes;

 

SHA-3, SHAKE, cSHAKE ve KMAC

 

SHA-3, SHA-2'den farklı bir yapı (Keccak) üzerine kurulmuştur, bu yüzden bir ailedeki bir zayıflık diğerine sıçramaz; uzun vadeli güvence isteyen protokollerin genellikle her ikisini birden belirtmesinin nedeni budur. SHAKE128 ve SHAKE256, genişletilebilir çıktı fonksiyonlarıdır: sabit bir özet boyutu yerine, ihtiyacınız kadar bayt istersiniz ve aynı girdiden elde edilen daha kısa bir çıktı, her zaman daha uzun bir çıktının önekidir. ML-KEM, ML-DSA ve SLH-DSA (bkz. Kuantum Sonrası Kriptografi) dahili olarak hepsi SHAKE üzerine kuruludur. KMAC, cSHAKE üzerine kurulu SHA-3'ün kendi mesaj kimlik doğrulama kodudur.

 


function sgcSHA3_224(const aData: TBytes): TBytes;
function sgcSHA3_256(const aData: TBytes): TBytes;
function sgcSHA3_384(const aData: TBytes): TBytes;
function sgcSHA3_512(const aData: TBytes): TBytes;
function sgcSHAKE128(const aData: TBytes; aLen: Integer): TBytes;
function sgcSHAKE256(const aData: TBytes; aLen: Integer): TBytes;
function sgcKMAC128(const aKey, aData: TBytes; aLen: Integer; const aCustom: TBytes): TBytes;
function sgcKMAC256(const aKey, aData: TBytes; aLen: Integer; const aCustom: TBytes): TBytes;

 

BLAKE2b ve BLAKE2s

 

BLAKE2, aynı güvenlik marjını sunarken yazılımda SHA-2 ve SHA-3'ten daha hızlıdır ve HMAC yapısına gerek kalmadan doğrudan isteğe bağlı bir anahtar kabul eder. BLAKE2b, 512 bit'e kadar özetlerle 64 bit platformları hedefler; BLAKE2s, 256 bit'e kadar özetlerle 32 bit ve gömülü platformları hedefler. Daha kısa bir özet, tam özetin bir kesilmişi değildir; uzunluk özetin kendisine karıştırılır, bu yüzden bir program boyutları değiştirip eşleşen bir çıktı bekleyemez.

 


function sgcBlake2b(const aData: TBytes; aDigestLen: Integer = 64): TBytes;
function sgcBlake2b_Keyed(const aKey, aData: TBytes; aDigestLen: Integer = 64): TBytes;
function sgcBlake2s(const aData: TBytes; aDigestLen: Integer = 32): TBytes;
function sgcBlake2s_Keyed(const aKey, aData: TBytes; aDigestLen: Integer = 32): TBytes;

 

SipHash

 

SipHash-2-4, hash tablosu aramaları için tasarlanmış hızlı, anahtarlı bir hash'tir. Görevi, bir saldırganın uygulamanıza, hepsi aynı kovaya düşen seçilmiş girdiler beslemesini ve O(1) bir aramayı O(n)'ye çevirmesini engellemektir; bu, hash flooding olarak bilinen bir hizmet reddi tekniğidir. Tam olarak 16 bayt anahtar alır ve 8 baytlık bir etiket üretir; genel amaçlı bir MAC değildir ve mesajları kimlik doğrulamak için kullanılmamalıdır.

 


function sgcSipHash24(const aKey, aData: TBytes): TBytes;

 

HMAC

 

HMAC, yukarıdaki hash'lerin herhangi birini bir mesaj kimlik doğrulama koduna dönüştürür. Altta yatan hash doğrudan bir anahtar kabul etmediğinde (SHA-1, SHA-2) standart seçimdir.

 


function sgcHMAC_SHA1(const aKey, aData: TBytes): TBytes;
function sgcHMAC_SHA256(const aKey, aData: TBytes): TBytes;
function sgcHMAC_SHA384(const aKey, aData: TBytes): TBytes;
function sgcHMAC_SHA512(const aKey, aData: TBytes): TBytes;

var
  oTag: TBytes;
begin
  oTag := sgcHMAC_SHA256(TBytes(oKey), TBytes(oMessage));
end;

 

AES-CMAC

 

CMAC, bir hash yerine bir blok şifreden bir MAC oluşturur. Bir protokol AES-CMAC'ı isim olarak belirttiği yerlerde kullanın (akıllı kart ve IoT spesifikasyonlarında yaygındır); aksi halde HMAC-SHA256 daha olağan varsayılandır.

 


function sgcAES_CMAC(const aKey, aData: TBytes): TBytes;
function sgcAES_CMAC_Verify(const aKey, aData, aTag: TBytes): Boolean;

 

Poly1305

 

Poly1305 tek kullanımlık bir doğrulayıcıdır: aynı anahtarla asla iki kez kullanılmamalıdır. Pratikte doğrudan çağrılmaz; Simetrik Şifreleme sayfasındaki, her mesaj için yeni bir tek kullanımlık anahtar türeten ChaCha20-Poly1305 ve XChaCha20-Poly1305 AEAD şifrelerinin kimlik doğrulama yarısıdır.

 


function sgcPoly1305(const aKey, aData: TBytes): TBytes;
function sgcPoly1305_Verify(const aKey, aData, aTag: TBytes): Boolean;

 

Bir MAC'i veya bir parola hash'ini karşılaştırma

 

Bunlardan biri güvenilmeyen bir kaynaktan geldiğinde iki etiketi veya özeti asla sade bir = ile karşılaştırmayın. Bir uyuşmazlık bulur bulmaz geri dönen bayt bayt karşılaştırma, uyuşmazlık ne kadar erken oluşursa o kadar az zaman alır; bu, bir saldırganın geçerli bir etiketi tek seferde bir bayt olacak şekilde çok sayıda denemeyle sahtelemesi için yeterli bir sinyaldir. Bunun yerine sgcCrypto_Encoding içindeki sabit zamanlı karşılaştırmayı kullanın; Cryptography genel bakış sayfasında Kodlama & yardımcı araçlar altında listelenmiştir.

 


function sgcConstantTimeEquals(const aLeft, aRight: TBytes): Boolean;

 

RIPEMD-160

 

Avrupa RIPE projesinden 160 bitlik bir özet, sgcCrypto_Legacy içindedir ama aşağıdaki bölümün kastettiği anlamda eski (legacy) değildir. MD5 ve SHA-1'in kırık olduğu şekilde kırık değildir, ama SHA-256'dan daha yavaştır ve daha az güvenlik marjı sunar, bu yüzden bir biçimin bunu isim olarak belirttiği yerlere aittir, varsayılan bir seçim olarak değil. Bitcoin ve ondan türeyen her zincir, SHA-256 üzerine katmanlanmış olarak bunu adresler için kullanır. HMAC-RIPEMD160, RFC 2286'dır.

 


function sgcRIPEMD160(const aData: TBytes): TBytes;
function sgcHMAC_RIPEMD160(const aKey, aData: TBytes): TBytes;

var
  oHash160: TBytes;
begin
  { Bitcoin adres özeti: SHA-256 üzerinde RIPEMD-160 }
  oHash160 := sgcRIPEMD160(sgcSHA256(oPublicKey));
end;

 

Eski hash'ler

 

sgcCrypto_Legacy MD4, MD5 ve HMAC-MD5 sağlar. Üçü de güvenlik ilkesi olarak kırıktır: hem MD4 hem de MD5 için pratik çarpışmalar yayınlanmıştır. Yalnızca bunları isim olarak belirten eski protokollerle ve dosya biçimleriyle (örneğin NTLM kimlik doğrulaması) birlikte çalışmak için var olurlar. Yeni hiçbir şey için bunları seçmeyin; bunun yerine SHA-256 veya BLAKE2b kullanın.

 


function sgcMD4(const aData: TBytes): TBytes;
function sgcMD5(const aData: TBytes): TBytes;
function sgcHMAC_MD5(const aKey, aData: TBytes): TBytes;