İçeriğe geç
LexerLangv0.1.0

Şifreleme

Parola özetleme, pepper, token üretimi ve HMAC ile webhook doğrulama.

LexerLang
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.decryptAES-256-CBC — yalnızca eski uyumluluk
AyarVarsayılan
provider"argon2id" ("bcrypt" de var)
pepper (ya da key)yok
memory · iterations · parallelism65536 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.

LexerLang
$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:

LexerLang
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 if

Token#

LexerLang
$anahtar = crypto.token(32)      # rastgele, 43 karakter

Oturum 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:

LexerLang
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:

LexerLang
$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.

Sırada#

Ara katmanlar.