scrypt nedir?

scrypt, Colin Percival tarafından 2009'da tasarlanan ve RFC 7914 olarak yayımlanan bir parola hash'leme işlevi veya anahtar türetme işlevdir. bcrypt ve Argon2 gibi, bilerek yavaş çalışır; böylece her tahmin saldırgana zaman kaybettirir. Ayrıca bellek yoğundur: her hash işlemi büyük bir bellek bloğunu doldurur ve ardından bu bloğu öngörülemeyen bir sırayla okur. Bu da GPU'lar ve özel yongalarla yapılan kırma işlemlerini çok daha maliyetli hâle getirir. scrypt; birçok web framework'ünde, Node.js, Python ve Go standart kütüphanelerinde parola saklama amacıyla ve Ethereum keystore'ları gibi kripto para cüzdanlarında kullanılır.

Araç açıklaması

Bu araç, tarayıcınızda scrypt kullanarak bir parolanın hash'ini oluşturur. Rastgele bir salt ve OWASP'ın parola saklama için önerdiği ayarlarla başlar. Salt değerini, maliyeti (N), blok boyutunu (r), paralelleştirme değerini (p) ve anahtar uzunluğunu değiştirebilirsiniz. Hash; parola kütüphanelerinin kullanabileceği bir PHC dizesi biçiminde, ayrıca salt'ı ve parametreleri kendi başına saklayan kodlar için hex ve Base64 biçimlerinde hazır olur.

Özellikler

  • RFC 7914'te tanımlandığı şekilde scrypt kullanarak bir parolanın hash'ini oluşturur
  • Yeni bir salt oluşturmak için düğme sunarak rastgele 16 baytlık salt üretir
  • Başka bir yerde oluşturulmuş bir hash'i yeniden üretmek için kendi salt'ınızı girmenize olanak tanır
  • Maliyeti (N) 2⁴ ile 2²⁰ arasında ayarlamanıza, ayrıca blok boyutunu (r), paralelleştirmeyi (p) ve anahtar uzunluğunu belirlemenize olanak tanır
  • Hash'i PHC dizesi, hex ve Base64 biçimlerinde sunar
  • Yavaş hash işlemlerinin ilerlemesini gösterir ve ayarların 1 GiB'den fazla bellek gerektirmesi durumunda uyarır
  • Tarayıcınızda çalışır; böylece parola cihazınızdan ayrılmaz

Parametreler

Parametre Varsayılan İşlevi
Maliyet (N) 131072 (2¹⁷) Bellek bloklarının sayısıdır. Bu değerin iki katına çıkarılması süreyi ve bellek kullanımını iki katına çıkarır.
Blok boyutu (r) 8 Her bloğun boyutudur: 128 × r bayt. Süreyi ve bellek kullanımını da etkiler.
Paralelleştirme (p) 1 Birbirinden bağımsız çalıştırmaların sayısıdır. Belleği değil, süreyi çarpar.
Anahtar uzunluğu 32 bayt Hash'in uzunluğudur.

Gereken bellek miktarı 128 × N × r bayttır. Varsayılan ayarlarda bu değer 128 MiB'dir.

Çıktı biçimleri

PHC dizesi, parolayı daha sonra doğrulamak için gereken tüm bilgileri içerir: algoritma, parametreler, salt ve hash. Salt ile hash, dolgulu olmayan Base64 biçimindedir:

$scrypt$ln=17,r=8,p=1$<salt>$<hash>

ln, N'nin 2 tabanındaki logaritmasıdır; dolayısıyla ln=17, N = 131072 anlamına gelir. Python'ın passlib kütüphanesi, Rust'ın scrypt crate'i ve Node.js'in @phc/scrypt paketi bu biçimi okuyup yazar.

Hex ve Base64 alanları yalnızca hash'i içerir. Bu, Node.js'teki crypto.scrypt, Python'daki hashlib.scrypt ve Go'daki scrypt.Key işlevlerinin döndürdüğü biçimdir. Salt'ı ve parametreleri hash'in yanında saklayın.

Nasıl çalışır?

Salt alanı metin olarak okunur ve UTF-8 biçiminde kodlanır; bu, Node.js'teki crypto.scrypt işlevine string türünde bir salt iletmeyle aynıdır. Rastgele salt, 32 hex karakter olarak yazılan 16 rastgele bayttan oluşur ve hash işleminde bu 32 karakter kullanılır. Parola da UTF-8 biçiminde kodlanır. Sayfanın yanıt vermeye devam etmesi için hash arka plan iş parçacığında hesaplanır ve herhangi bir girişi değiştirdiğinizde işlem yeniden başlar.

İpuçları

  • Her parola için yeni ve rastgele bir salt kullanın. Aynı parola, aynı salt ile her zaman aynı hash'i verir.
  • OWASP, parola saklama için en az N = 2¹⁷, r = 8, p = 1 değerlerini önerir. Sunucunuzun her giriş denemesi için karşılayabileceği ölçüde N değerini artırın.
  • Node.js, varsayılan olarak scrypt için bellek kullanımını 32 MiB ile sınırlar. r = 8 ile N = 2¹⁷ veya daha yüksek bir değer kullanırken crypto.scrypt işlevine daha yüksek bir maxmem değeri iletin.
  • Başka bir sistemde oluşturulmuş bir hash'i doğrulamak için aynı parolayı, salt'ı ve parametreleri girip sonuçları karşılaştırın.