2026-10-11 | AI |

yescrypt: Hash Password yang Menjaga Login Linux Modern

yescrypt: Hash Password yang Menjaga Login Linux Modern
Buka /etc/shadow di Linux modern (Debian 11+, Fedora, dan banyak lainnya), dan hash password-mu kemungkinan diawali $y$. Itu adalah yescrypt — fungsi hash password yang sengaja dirancang lambat dan boros memori. Terdengar seperti kelemahan, tapi justru di situlah kekuatannya. Mari kita bedah kenapa.

1. Kenapa hash biasa (SHA-256) buruk untuk password

Fungsi hash seperti SHA-256 dirancang cepat — itu bagus untuk integritas file, tapi bencana untuk password. Penyerang yang mencuri database hash bisa menebak dengan kecepatan luar biasa:
  • Sebuah GPU modern bisa menghitung miliaran SHA-256 per detik.
  • Artinya seluruh daftar kata, kombinasi umum, dan kebocoran lama bisa dicoba dalam hitungan menit.
Hash yang cepat berarti penyerang juga cepat. Untuk password, kita justru ingin fungsi yang mahal untuk dihitung berulang kali.

2. Tiga lapis pertahanan

Hash password modern menumpuk tiga ide:
  1. Salt — nilai acak unik per password, dicampur sebelum hashing. Ini mematikan rainbow table (tabel hash pra-hitung) dan memastikan dua orang dengan password sama punya hash berbeda.
  2. Lambat (cost factor) — sengaja memperlambat satu perhitungan (mis. puluhan milidetik). Tak terasa saat login sekali, tapi melumpuhkan penebakan jutaan kali.
  3. Memory-hard — selain lambat di CPU, ia menuntut banyak RAM. Inilah senjata pamungkas melawan perangkat keras khusus.
Tiga lapis pertahanan hash password: salt, lambat, memory-hard
Hash cepat seperti SHA-256 bisa diserang miliaran kali per detik dengan GPU. Fungsi memory-hard seperti yescrypt memaksa tiap tebakan memakai banyak RAM, sehingga paralelisasi di GPU/ASIC jadi mahal.

3. Kenapa “memory-hard” begitu ampuh

Penyerang serius tidak memakai CPU biasa — mereka memakai GPU, FPGA, atau ASIC yang bisa menjalankan ribuan perhitungan paralel dengan biaya murah per unit. Yang mahal dan sulit diperbanyak pada perangkat seperti itu bukanlah logika, melainkan memori cepat.
Fungsi memory-hard memaksa setiap perhitungan hash menempati, katakanlah, puluhan megabyte RAM selama berjalan. Mau menjalankan 10.000 tebakan paralel? Butuh ratusan gigabyte RAM cepat — jauh lebih mahal daripada menambah inti aritmetika. Dengan kata lain, memory-hardness meratakan lapangan antara penyerang berperangkat khusus dan server biasa.

4. Dari scrypt ke yescrypt

Ide memory-hard dipelopori oleh scrypt (2009). Parameternya:
  • N — faktor biaya memori/waktu (harus pangkat 2).
  • r — ukuran blok; memori yang dipakai kira-kira 128 · N · r byte.
  • p — paralelisme.
yescrypt adalah penerus scrypt. Ia mempertahankan inti memory-hard scrypt, lalu menambah:
  • pwxform — langkah berbasis tabel (S-box) yang menambah CPU-hardness, mempersulit implementasi ASIC murni.
  • Dukungan ROM — sebuah blok memori besar yang dibagi bersama (mis. beberapa GB) untuk menaikkan biaya penyerang lebih jauh.
  • Efisiensi & fleksibilitas lebih baik pada tingkat keamanan rendah (penting untuk hashing login yang sering).
yescrypt adalah salah satu penerima penghargaan khusus di Password Hashing Competition (yang dimenangkan Argon2), dan kini menjadi hash password default di banyak distribusi Linux lewat pustaka libxcrypt.

5. Mendemokan memory-hardness

yescrypt sendiri rumit untuk ditulis dari nol, tapi fondasinya — scrypt — sudah ada di pustaka standar Python. Mari lihat bagaimana biaya naik saat N dinaikkan:
import hashlib, os, time

pw, salt = b"correct horse battery staple", os.urandom(16)

for logN in [12, 14, 16, 17]:
    N, r, p = 1 << logN, 8, 1
    mem = 128 * N * r                      # perkiraan memori (byte)
    t0 = time.perf_counter()
    hashlib.scrypt(pw, salt=salt, n=N, r=r, p=p, maxmem=mem * 2 + (1 << 20))
    dt = (time.perf_counter() - t0) * 1000
    print(f"N=2^{logN}  memori ~{mem // 1024 // 1024:>3} MB  waktu {dt:6.1f} ms")
Keluarannya (di mesin uji):
N=2^12  memori ~  4 MB  waktu   10.4 ms
N=2^14  memori ~ 16 MB  waktu   39.7 ms
N=2^16  memori ~ 64 MB  waktu  173.8 ms
N=2^17  memori ~128 MB  waktu  343.3 ms
Perhatikan keduanya naik bersama: menggandakan N kira-kira menggandakan memori dan waktu sekaligus. Penyerang harus membayar kedua biaya itu untuk setiap tebakan — sementara server jujur hanya membayarnya sekali per login.
Biaya scrypt: memori dan waktu naik seiring parameter N
Menaikkan N menggandakan memori sekaligus waktu. Inilah tuas yang membuat penebakan massal jadi tak ekonomis.

6. Membaca hash $y$ di /etc/shadow

Hash yescrypt disimpan dalam format bertanda $, mirip hash Linux lain:
$y$ j9T $ zEarYv1Jl7X2Hq... $ 3b9q0d5h8M2k...Pq7
└┬┘ └┬┘   └──────┬───────┘   └───────┬────────┘
 │   │           │                   │
 │   │           │                   └─ hash (password + salt, hasil yescrypt)
 │   │           └─ salt (acak, unik per password)
 │   └─ parameter: flag + biaya (N, r) terkode base64 khusus yescrypt
 └─ pengenal algoritma: "y" = yescrypt
Bagian j9T adalah parameter terenkode: ia memberitahu libxcrypt flag yescrypt serta biaya memori/waktu yang dipakai (nilai j9T adalah profil default pada Debian/Ubuntu). Karena semua parameter ikut tersimpan, sistem bisa memverifikasi password lama meski kelak default-nya dinaikkan.

7. Perbandingan singkat

Fungsi Jenis kekerasan Memori khas Status
bcrypt CPU-hard ~4 KB (tetap) lama, masih aman untuk banyak kasus
scrypt memory-hard bisa diatur (MB) fondasi, dipakai juga di kripto
Argon2 memory-hard bisa diatur (MB) pemenang PHC, rekomendasi baru
yescrypt memory-hard + CPU-hard bisa diatur (MB–GB) default hash login Linux modern

Penutup

  • Password butuh hash yang lambat dan boros memori — kebalikan dari hash cepat seperti SHA-256.
  • Memory-hardness melucuti keunggulan penyerang berperangkat GPU/ASIC.
  • yescrypt menggabungkan memory-hardness scrypt dengan CPU-hardness tambahan, dan kini diam-diam menjaga login di sebagian besar Linux modern lewat deretan $y$.
Lain kali kamu mengetik password Linux, ada fungsi yang sengaja “membuang” belasan milidetik dan belasan megabyte demi kamu — justru supaya penyerang harus membayar harga yang sama, berkali-kali lipat.