Şifreleme
Parola özetleme, pepper, token üretimi ve HMAC ile webhook doğrulama.
use crypto
crypto.config.set({provider: "argon2id", pepper: $gizli_anahtar})
$hash = crypto.crypt($parola)
if crypto.verify($parola, $hash) then
out("giriş başarılı")
end if| Çağrı | Döner |
|---|---|
crypto.crypt($parola[, {...}]) | özet |
crypto.verify($parola, $hash[, {...}]) | true / false |
crypto.needs_rehash($hash) | ayarlar değişmiş mi |
crypto.token([$bayt]) | rastgele metin (varsayılan 32 bayt) |
crypto.uuid() | sürüm 4 tanımlayıcı |
crypto.hmac($veri, $anahtar) | HMAC-SHA256, onaltılık |
crypto.sha256($veri) | özet, onaltılık |
crypto.compare($a, $b) | sabit sürede karşılaştırma |
crypto.md5($veri) | özet — yalnızca eski uyumluluk |
crypto.encrypt / crypto.decrypt | AES-256-CBC — yalnızca eski uyumluluk |
| Ayar | Varsayılan |
|---|---|
provider | "argon2id" ("bcrypt" de var) |
pepper (ya da key) | yok |
memory · iterations · parallelism | 65536 KiB · 3 · çekirdek sayısı (≤4) |
cost (bcrypt) | 12 |
Pepper#
Pepper, özetlenmeye giren paroloya eklenen ve veritabanında durmayan bir gizli anahtardır. Salt her kayıt için farklıdır ve özetin yanında saklanır; pepper tüm uygulama için aynıdır ve yalnızca ortam değişkeninde bulunur.
Faydası somut: veritabanı sızsa bile pepper olmadan sözlük saldırısı çalışmaz. Saldırganın elindeki özetler, bilmediği bir değerle karıştırılmış parolaların özetleridir.
$env = new env_parser(path.pwd + "/.env")
crypto.config.set({provider: "argon2id", pepper: $env.require("PASSWORD_PEPPER")})Maliyeti artırmak#
Özet kendi ayarlarını taşır. Maliyeti yükselttiğinizde eski özetler geçerli kalır; kullanıcı bir daha giriş yaptığında yenisini üretirsiniz:
if crypto.verify($parola, $kayit.hash) then
if crypto.needs_rehash($kayit.hash) then
$yeni = crypto.crypt($parola)
$db.execute("UPDATE users SET hash = $1 WHERE id = $2", $yeni, $kayit.id)
end if
end ifToken#
$anahtar = crypto.token(32) # rastgele, 43 karakterOturum kimliği, parola sıfırlama bağlantısı, API anahtarı. Kriptografik olarak güvenli bir kaynaktan üretilir.
Bir tokeni karşılaştırırken == yerine crypto.compare kullanın:
if crypto.compare($gelen, $beklenen) then
out("geçerli")
end if== ilk farklı bayta kadar karşılaştırıp çıkar; bu, geçen süreden tokenin kaç karakterinin doğru olduğunun okunabilmesi demektir. compare her durumda aynı süreyi harcar.
Webhook doğrulama#
Ödeme sağlayıcıları gönderdikleri gövdeyi paylaşılan bir anahtarla imzalar:
$imza = crypto.hmac($req.body, $env.require("WEBHOOK_SECRET"))
if not crypto.compare($imza, $req.header("x-signature")) then
$res.status(403)
$res.send("gecersiz imza")
return
end ifİmza ham gövde üzerinden hesaplanır. Çözülmüş JSON'u yeniden kodlayıp imzalamak, anahtar sırası ya da boşluk farkı yüzünden eşleşmez.
Eski uyumluluk#
md5, encrypt ve decrypt listede duruyor ama yeni kod için değildir. MD5 parola için kırıktır; AES-256-CBC doğru kullanıldığında güvenlidir ama IV yönetimini ve kimlik doğrulamayı size bırakır. Var olmalarının sebebi eski bir sistemden veri taşımaktır.