un

guest
1 / ?
back to lessons

Apa yang Membuat Format Penyimpanan Dapat Dikembalikan

Empat format penyimpanan, urut berdasarkan ketersediaan pengembalian:

| Format | Dapat Dikembalikan? | Contoh | Metode Pengembalian |

|--------|-------------|---------|-----------------|

| Plaintext | Ya | password: hunter2 | Baca file |

| Base64 | Ya | cGFzc3dvcmQ= | base64 --decode |

| Enkripsi reversible (AES) | Ya | ENC[AES256:...] | Kode kunci untuk mengenkripsi |

| Hash satu arah (bcrypt) | Tidak | $2b$12$... | Tidak bisa diubah; harus brute-force |

Plaintext, base64, & enkripsi reversible: semua dapat dikembalikan. Dump basis data tunggal memberi penyerang semua kata sandi dalam bentuk jelas, untuk semua pengguna, sekaligus. Breach satu; eksposisi total.

Contoh Mailman 2.x

Mailman 2.x (manajer surel GNU): menyimpan kata sandi pengguna surel dalam bentuk plaintext. Email pengingat kata sandi bulanan: mengirim semua pengguna surel mereka kata sandi dalam bentuk jelas. Dua kerugian terpisah, keduanya MOAD-0006:

1. Penyimpanan: plaintext dalam basis data daftar surel. Pengintaian server mengungkap semua kata sandi pengguna surel.

2. Siar: email bulanan mengirim kata sandi plaintext melalui SMTP ke server email pengguna surel. Email berjalan dalam bentuk jelas di beberapa SMTP hop.

Tim Mailman merancang kedua perilaku ini. Fitur pengembalian adalah: pengguna bisa mengambil kembali kata sandi yang lupa. Nama Safe Kaca berasal dari ini: safe itu menyimpan kredensial dalam bentuk yang dapat dilihat. Siapa pun yang mencapai safe bisa membaca semua isinya sekaligus.

Prinsip Sudah Dirampok

Kredensial yang disimpan dalam bentuk yang dapat dikembalikan adalah kredensial yang sudah dirampok. Penyerang belum tiba. Breach belum terjadi. Namun, arsitektur menjamin: ketika terjadi breach, semua kredensial jatuh sekaligus. Tidak ada breach yang terisolasi; setiap kredensial dalam penyimpanan yang dapat dikembalikan secara bersamaan transfer ke penyerang dalam operasi yang sama.

MOAD-0006 vs MOAD-0004

MOAD-0004 (Rahasia Log): kata sandi ditulis ke log secara tidak sengaja. Penulisan log tidak ada niatnya; itu adalah efek samping dari mengaktifkan logging header untuk debugging.

MOAD-0006 (Safe Kaca): kata sandi disimpan dalam bentuk yang dapat dikembalikan oleh desain arsitektur. Pengembalian adalah niat. Fitur reminder kata sandi membutuhkan menyimpan kata sandi. Fitur display-password membutuhkan menyimpannya. Pemilihan arsitektur untuk pengembalian menciptakan kerusakan.

Penggolongan satu baris: MOAD-0004 memasukkan kreditensial ke dalam log secara tidak sengaja; MOAD-0006 menyimpan kreditensial dalam bentuk yang dapat dikembalikan dengan sengaja. Perbaikan beroperasi pada lapisan yang berbeda.

Struktural vs Accidental

Perbedaan arsitektural antara MOAD-0006 & MOAD-0004 menentukan strategi perbaikan. Menulis log secara tidak sengaja: perbaiki lapisan serialisasi. Penyimpanan yang dirancang untuk pemulihan: merancang kembali fitur yang membutuhkan pemulihan.

Mengapa Safe Kaca adalah yang struktural berbeda dari MOAD-0004? Satu baris menggambarkan setiap kecacatan. Apa artinya untuk perbaikan?

Mengapa bcrypt Berfungsi

Fungsi hash satu arah menerima kata sandi dan menghasilkan digest dengan panjang tetap. Dengan digest, kata sandi asli tidak dapat diambil kembali. Bukan 'sulit untuk diambil kembali': tidak bisa dibalikkan. Fungsi berjalan hanya dalam satu arah.

Tiga properti yang diperlukan untuk penyimpanan kreditensial:

1. Satu arah (tahan praeimage). Dengan hash(kata sandi), tidak ada algoritma yang mengembalikan kata sandi lebih cepat dari brute-force. bcrypt, scrypt, dan argon2 semua memenuhi properti ini.

2. Garam. Nilai acak yang disisipkan sebelum hashing. Kata sandi yang sama, garam yang berbeda, hash yang berbeda. Tujuan: mengalahkan tabel pelangi (precomputed hash dictionaries). Tanpa garam: seorang penyerang menghitung hash('password123') sekali dan memeriksanya dengan 1 juta pengguna secara bersamaan. Dengan garam: setiap pengguna memiliki hash unik bahkan untuk kata sandi yang sama.

3. Slow by design. bcrypt accepts a work factor. Higher work factor: more iterations, more compute time per hash attempt. Login: 300ms to hash once. Acceptable. Brute-force: 300ms per attempt. At 1 billion attempts: 9.5 years per password. Unacceptable for an attacker. The slowness: a feature, not a defect.

import bcrypt

# Simpan: hash satu arah dengan garam
def store_password(plaintext: str) -> bytes:
    return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))

# Verifikasi: hash kandidat & bandingkan inti
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
    return bcrypt.checkpw(plaintext.encode(), stored_hash)

# TIDAK pernah disimpan: kata sandi plaintext
# TIDAK pernah dikeluarkan: plaintext dari hash
# Reset kata sandi, bukan pengingat kata sandi

Keseimbangan

Hash satu arah membuat pemulihan kata sandi mustahil. Seorang pengguna yang lupa kata sandinya tidak dapat menerima kembali kata sandinya. Email pengingat kata sandi tidak dapat ada. Pengalaman pengguna berubah: 'lupa kata sandinya? atur ulangnya.' Bukan pengurangan: batas keamanan.

Bocornya basis data yang mengungkapkan hash bcrypt: semua hash terlihat, tidak ada kata sandi yang terlihat. Seorang penyerang harus melakukan brute-force pada setiap hash individu, dengan waktu 300ms pernya, dengan garam per-pengguna yang mengalahkan tabel yang telah dihitung sebelumnya. Bocornya kata sandi yang mengungkapkan kata sandi plaintext: eksposur total seketika.

Enkripsi Kuat Tidak Cukup

Sebuah audit keamanan mengidentifikasi sistem penyimpanan kredit. Kata sandi disimpan menggunakan enkripsi AES-256-CBC dengan kunci yang berada di server. Laporan audit mengidentifikasi sebagai kecacatan Glass Safe.

Tim ahli mengatakan: 'AES-256 adalah cipher simetri terkuat yang tersedia. Kunci hidup di modul keamanan perangkat keras. Tidak ada penyerang yang dapat mengenkripsi kata sandi ini.'

Mengapa ini tetap menjadi MOAD-0006 meskipun ada enkripsi yang kuat? Apa yang benar-benar perbaikan?