Kembali ke jurnalCATATAN FAJAR
Cryptography4 menit baca

[Crypto: age] Passphrase atau Key Pair

Bandingkan passphrase dengan key pair age, bikin key kamu sendiri, dan enkripsi satu file untuk dua recipient.

BAGIAN 5 DARI 6Crypto: age
  1. 01[Crypto: age] Dari Password ke Ciphertext
  2. 02[Crypto: age] Membaca Header
  3. 03[Crypto: age] scrypt, Dari Password ke Key
  4. 04[Crypto: age] ChaCha20-Poly1305, Menyegel Isi File
  5. 05[Crypto: age] Passphrase atau Key PairKamu di sini
  6. 06[Crypto: age] Berapa Lama Serangan Passphrase Berlangsung?
Di artikel ini 5 bagian

Passphrase adalah shared secret. Siapa pun yang tahu passphrase itu bisa mendekripsi file-nya. Key pair punya public key untuk enkripsi dan secret key untuk dekripsi.

Perbedaan ini berguna waktu seseorang harus mengirim file privat ke kamu. Kamu memberikan public key kamu ke orang itu. Orang itu bisa mengenkripsi file tanpa secret key kamu atau passphrase bersama.

Contoh ini pakai key X25519. X25519 adalah algoritma key agreement kriptografis. age mendukung tipe recipient lain yang nggak dibahas di contoh ini.

Membuat key pair

Command-command ini pakai age 1.3.1. Post pertama memberikan command instalasi untuk macOS.

  1. Bikin direktori baru untuk contoh ini:

    bash
    mkdir age-key-demo
    
  2. Pindah ke direktori itu:

    bash
    cd age-key-demo
    
  3. Generate key pair-nya:

    bash
    age-keygen -o key.txt
    
  4. Tampilkan public key-nya aja:

    bash
    age-keygen -y key.txt
    

Public key dimulai dengan age1. Nilai yang kamu generate bakal berbeda dari nilai di contoh lain. Identity file, key.txt, berisi secret key dan komentar.

Secret key dimulai dengan AGE-SECRET-KEY-1. Identity adalah informasi rahasia yang dipakai age untuk dekripsi. Recipient adalah informasi publik yang dipakai age untuk enkripsi.

Jaga key.txt tetap privat. Simpan backup yang aman dari file itu. Tanpa secret key yang bisa dipakai atau identity recipient lain, kamu nggak bisa mendekripsi file yang dibuat untuk public key ini.

Enkripsi dengan public key kamu

Variabel di bawah ini menyimpan public key dari identity file kamu sendiri. Cara ini menghindari kesalahan yang umum di contoh: enkripsi ke sample key yang dipublikasikan, yang nggak bisa kamu dekripsi.

  1. Simpan public key kamu di shell variable:

    bash
    AGE_DEMO_RECIPIENT=$(age-keygen -y key.txt)
    
  2. Bikin file teks contohnya:

    bash
    printf '%s\n' 'Anyone can encrypt to my public key.' > note.txt
    
  3. Enkripsi catatannya:

    bash
    age -r "$AGE_DEMO_RECIPIENT" -o note.age note.txt
    
  4. Dekripsi catatannya dengan identity file kamu:

    bash
    age -d -i key.txt note.age
    

Opsi -r menentukan recipient. Opsi -i menentukan identity file untuk dekripsi. Output-nya:

text
Anyone can encrypt to my public key.

Enkripsi nggak memakai prompt passphrase di contoh ini. Script backup bisa cuma menyimpan public key. Secret key bisa tetap di komputer yang dipakai untuk me-restore backup.

Public key nggak harus rahasia. Kamu harus mendapatkan public key yang benar untuk recipient yang dimaksud. Kalau kamu pakai public key yang udah diganti, orang lain bisa mendekripsi file itu.

Apa yang berubah di header

Post header menunjukkan scrypt stanza untuk passphrase. Recipient X25519 pakai stanza yang berbeda. Contoh awal mencatat header ini:

text
age-encryption.org/v1
-> X25519 FtU1s5d9k32gVivtjqvPX8rzlFO0Us90/nBclSGBnmk
UjnBxWgCapXFCE96yIVgtR2L9xhWnSixZsA8qREIBZg
--- CJaG+8hCydCZNsY5fLWDQtFPXBLoTxs7UdDtgjvNZgM

File kamu bakal punya nilai acak yang berbeda. Nilai setelah X25519 adalah ephemeral public key. Di sini, ephemeral artinya age meng-generate key baru untuk stanza dan file ini.

age menggabungkan ephemeral secret key dengan public key milik recipient lewat X25519. Kalkulasi ini menghasilkan shared secret. Lalu age menurunkan wrapping key dari secret itu dengan HKDF-SHA-256.

Recipient memakai ephemeral public key yang tersimpan dan secret key miliknya sendiri untuk menghitung shared secret yang sama. Jadi, recipient bisa menurunkan wrapping key yang sama. Kedua pihak nggak menyimpan shared secret di header.

Pseudocode ini menunjukkan kalkulasi enkripsinya. Simbol || artinya menyambung urutan byte:

text
shared secret = X25519(ephemeral secret key, recipient public key)
wrapping key = HKDF-SHA-256(
    input key material = shared secret,
    salt = ephemeral public key || recipient public key,
    info = "age-encryption.org/v1/X25519"
)
stanza body = ChaCha20-Poly1305(wrapping key, file key)

Operasi wrapping pakai nonce dua belas byte nol dan associated data yang kosong. Spesifikasi format age mendefinisikan operasi lengkapnya.

File key dan payload tetap punya tugas yang dijelaskan di post cipher. Cuma metode untuk menurunkan wrapping key yang berubah.

Mengenkripsi satu file untuk dua recipient

  1. Generate identity file kedua:

    bash
    age-keygen -o key2.txt
    
  2. Simpan public key-nya:

    bash
    AGE_DEMO_RECIPIENT_TWO=$(age-keygen -y key2.txt)
    
  3. Enkripsi catatannya untuk kedua recipient:

    bash
    age -r "$AGE_DEMO_RECIPIENT" -r "$AGE_DEMO_RECIPIENT_TWO" -o two.age note.txt
    
  4. Dekripsi dengan identity pertama:

    bash
    age -d -i key.txt two.age
    
  5. Dekripsi dengan identity kedua:

    bash
    age -d -i key2.txt two.age
    

Kedua command itu mengembalikan catatan yang sama. Setiap identity bekerja secara independen. Kedua orang itu nggak perlu menyetujui dekripsi bersama-sama.

age mengenkripsi isi file sekali. age mengenkripsi file key yang sama secara terpisah untuk setiap recipient. File hasilnya punya beberapa stanza dan satu payload.

Mode passphrase cuma mengizinkan satu scrypt stanza. age menolak command yang menggabungkan -p dengan -r. age nggak bisa menggabungkan metode passphrase dan public key ini dalam satu operasi enkripsi.

Pilih rahasia yang bisa kamu kelola

PertanyaanPassphraseKey pair X25519
Apa yang memungkinkan enkripsi?Passphrase yang dipilihPublic key milik recipient
Apa yang memungkinkan dekripsi?Passphrase yang samaSecret key yang cocok
Apa yang harus tetap rahasia?Passphrase-nyaIdentity file
Apa yang diberikan user?Passphrase di promptPublic key atau identity file
Apa contoh pemakaian yang berguna?File yang kamu dekripsi dengan passphrase yang tersimpanBackup otomatis atau file dari orang lain

Key pair menghilangkan passphrase buatan manusia dari jalur enkripsi ini. Pencurian secret key tetap bisa memungkinkan penyerang mendekripsi file.

Passphrase juga bisa aman kalau berasal dari pemilihan acak dan kamu menjaganya tetap rahasia. Post terakhir menunjukkan kenapa metode pemilihan lebih penting daripada jumlah karakter aja.

TOPIK

SELANJUTNYA DI SERI INI[Crypto: age] Berapa Lama Serangan Passphrase Berlangsung?

MAKASIH UDAH BACA

Gimana menurutmu?

Reaksi atau obrolan, dua-duanya selalu ditunggu.

Memuat reaksi…

Bagikan

Memuat komentar...

LANJUT JELAJAH

Satu pikiran bawa ke pikiran lain.

Semua tulisan
Kembali ke semua tulisanSatu catatan, pelan-pelan.