Keamanan · Mendalam
Siklus hidup kriptografi selengkapnya
Penjelasan rinci tentang apa yang terjadi pada data Anda di setiap langkah — dengan primitif, parameter, dan batas kepercayaan yang dijabarkan. Setiap langkah dibuka dengan ringkasan dalam bahasa sederhana, jadi Anda bisa membaca sedalam yang Anda mau.
Langkah 01 · Enkripsi
Rahasia Anda disegel di perangkat Anda
Sederhananya: pengacakan terjadi di browser Anda, sebelum apa pun diunggah. Yang kami terima sudah tidak bisa dibaca.
Saat Anda menekan Enkripsi, browser membuat kunci konten 256-bit yang baru dari WebCrypto CSPRNG dan mengenkripsi payload Anda dengan AES-256-GCM. GCM bersifat terautentikasi: setiap potongan data membawa tag 128-bit, sehingga perubahan apa pun di kemudian hari terdeteksi, alih-alih didekripsi diam-diam.
Teks dan file ditangani dengan cara yang sama — keduanya menjadi satu gumpalan data biner yang buram, diberi padding hingga ukuran standar sehingga kata sandi pendek dan file kecil tampak serupa. Plaintext tidak pernah menyentuh jaringan dan tidak pernah meninggalkan memori tab.
Langkah 02 · Penyimpanan kunci
Kunci tersembunyi di tautan, bukan di server kami
Sederhananya: bagian tautan setelah tanda # menyimpan kuncinya — dan browser tidak pernah mengirim bagian itu ke server mana pun.
Tautan Anda membawa seed acak 256-bit di fragmen URL — semua yang ada setelah tanda #. Menurut spesifikasi URL, fragmen dibuang oleh browser dan tidak pernah disertakan dalam permintaan yang dikirim ke server kami. Dari seed itu, browser menurunkan dengan HKDF sebuah nilai pencarian untuk menemukan rahasia dan kunci yang membuka bungkus kunci konten. Server hanya pernah melihat hash dari nilai pencarian itu.
Browser penerima membaca seed dari fragmen dan melakukan penurunan yang sama secara lokal. Inilah arti “zero-knowledge” di sini: memiliki ciphertext saja tidak ada gunanya tanpa tautannya.
Langkah 03 · Frasa sandi opsional
Kunci kedua yang hanya dipegang manusia
Sederhananya: tambahkan frasa sandi, dan bahkan orang yang memegang tautan lengkapnya tidak bisa membuka rahasia tanpa frasa sandi itu.
Jika Anda memasang frasa sandi, frasa sandi itu diperkuat dengan Argon2id — fungsi derivasi kunci yang boros memori — lalu digabungkan dengan seed menjadi kunci yang membungkus kunci konten. Frasa sandinya sendiri tidak pernah dikirim atau disimpan; hanya Anda dan penerima yang mengetahuinya. Tebakan yang salah dicoba ulang di browser penerima terhadap data yang sudah dimilikinya, sehingga server tidak bisa menghitungnya.
Sifat boros memori membuat penebakan offline berskala besar menjadi mahal, bahkan dengan GPU dan ASIC. Bagikan frasa sandi lewat saluran yang berbeda dari tautannya, sehingga kedua faktor itu tidak pernah bertemu di satu tempat. Modul Argon2 diambil pada setiap pembuatan dan penampilan rahasia, sehingga jaringan tidak bisa mengetahui rahasia mana yang memakai frasa sandi.
Langkah 04 · Transit & penyimpanan
Hanya ciphertext yang meninggalkan perangkat Anda
Sederhananya: kami menyimpan kotak terkunci dan waktu kedaluwarsa. Tidak ada yang lain — tanpa plaintext, tanpa kunci, tanpa catatan tentang Anda.
Gumpalan data diunggah lewat TLS dan disimpan sebagai ciphertext bersama kredensial yang di-hash, masa berlakunya, dan waktu kedaluwarsa yang dibulatkan. Kami sengaja tidak menyimpan identitas pengirim, penerima, log IP, waktu pembuatan, atau riwayat akses. Tidak ada sistem akun yang bisa mengaitkan rahasia dengan seseorang. Pembatasan laju bekerja dengan HMAC dari alamat menggunakan salt yang dirotasi, sehingga tidak ada data sebelum rotasi yang bisa dikaitkan dengan data sesudahnya.
Karena objek yang disimpan tidak bermakna tanpa seed di fragmen, peretasan server atau surat perintah pengadilan hanya menghasilkan byte buram dan hash yang tidak bisa diubah kembali menjadi apa pun.
Langkah 05 · Pengambilan & pemusnahan
Pembaca pertama yang menang — lalu dihapus
Sederhananya: membuka tautan sekali pakai menyerahkan kotaknya satu kali dan menghapus salinan di server. Atau musnahkan sendiri, kapan saja.
Tidak ada yang diambil saat halaman tampilan dimuat: permintaan baru dikirim saat ada klik atau tekan tombol yang sungguhan, sehingga pemindai tautan dan pratinjau chat tidak bisa menghabiskan rahasia. Untuk rahasia sekali lihat, server mengklaim barisnya dalam satu update bersyarat — tepat satu permintaan yang menang — dan rahasia dianggap sudah terpakai sejak saat itu. Browser yang sama dapat mengunduh ulang selama 15 menit jika koneksi terputus; tidak ada orang lain yang bisa, dan klaim yang tidak dikonfirmasi dimusnahkan, tidak pernah dibatalkan. Rahasia berbatas waktu cukup dibaca biasa sampai kedaluwarsa.
Setiap rahasia juga memiliki tautan pemusnah pribadi. Membukanya saja tidak memusnahkan apa pun; mengonfirmasinya langsung menghapus ciphertext — sebelum penerima mana pun sempat membacanya.
Model ancaman
Apa yang bisa dan tidak bisa dilihat shhnote
Versi jujurnya. Inilah persisnya letak batas kepercayaan.
Tidak pernah meninggalkan perangkat Anda
Yang tidak bisa kami lihat
Plaintext Anda · kunci konten dan seed · frasa sandi Anda · apakah frasa sandi dipasang · siapa yang membuat atau membuka rahasia · kapan rahasia dibuat · log akses tingkat IP. Tidak satu pun dikirim atau disimpan.
Disimpan di server kami
Yang memang kami simpan
Gumpalan data terenkripsi yang tidak bisa kami buka · kelas ukurannya setelah padding · hash satu arah dari nilai yang dipakai browser Anda untuk menemukan atau memusnahkannya · apakah rahasia itu sekali lihat atau berbatas waktu · waktu kedaluwarsa yang dibulatkan. Semuanya tidak berguna tanpa seed di tautan Anda.
Perlu diketahui
Catatan jujurnya
Siapa pun yang memegang tautan lengkapnya (dan frasa sandi, jika dipasang) dapat membaca rahasia sekali lihat — perlakukan tautan itu sebagai rahasianya. Setelah rahasia ditampilkan, halaman menimpa apa yang bisa ditimpanya saat Anda pergi, tetapi JavaScript tidak bisa menjaminnya; tutup tab setelah selesai. Browser yang dikendalikan otomatisasi dan menyuntikkan input sungguhan dapat membuka rahasia sekali lihat seperti yang dilakukan manusia — penerima kemudian tidak menemukan apa-apa, dan itulah hasil yang jujur. Menghapus rahasia menghilangkan catatannya; sisa data terenkripsi mungkin masih tertinggal di jurnal, ruang disk kosong, atau cadangan sampai tertimpa, sebagai ciphertext tanpa kunci. Rahasia berukuran besar yang disimpan di luar database membawa waktu file itu ditulis. Dan seperti aplikasi web mana pun, Anda memercayai kode yang dikirim ke browser Anda — karena itulah shhnote bersumber terbuka dan bisa di-host sendiri.
Spesifikasi kriptografi
Setiap primitif, di satu tempat
Enkripsi
Enkripsi simetris terautentikasi dalam potongan 64 KiB. Kunci 256-bit ditambah tag integritas per potongan, sehingga perubahan atau pemotongan data terdeteksi — bukan sekadar menjadi tak terbaca.
Derivasi kunci
Kunci dan pengenal diturunkan dari seed melalui HKDF-SHA-256. Frasa sandi opsional diperkuat dengan KDF yang boros memori, sehingga brute-force offline menjadi lambat dan mahal, bahkan dengan perangkat keras khusus.
Keacakan
Seed, kunci, salt, dan nonce berasal dari generator acak browser yang aman secara kriptografis. Tidak pernah Math.random(), tidak pernah bisa ditebak.
Penyimpanan kunci
Seed ikut di belakang tanda # pada tautan Anda. Browser tidak pernah mengirimkan fragmen, jadi seed tidak pernah sampai ke server kami.
Saat transit
Hanya ciphertext yang pernah meninggalkan perangkat Anda, dikirim lewat TLS modern. Yang kami terima hanyalah gumpalan data buram yang tidak bisa kami buka.
Saat disimpan
Kami menyimpan gumpalan data terenkripsi, hash satu arah dari kredensialnya, dan waktu kedaluwarsa yang dibulatkan — tanpa plaintext, tanpa kunci, tanpa metadata pengirim atau penerima.
FAQ teknis
Bagi yang peduli keamanan
Bagaimana jaminan sekali lihat ditegakkan terhadap race condition?
Proses penampilan rahasia menjalankan satu update bersyarat yang memindahkan baris dari “active” ke “claimed”. Dua permintaan bersamaan tidak mungkin sama-sama berhasil; permintaan kedua melihat catatan yang sudah diklaim dan mendapat respons “rahasia tidak ditemukan” yang sama seperti orang lain. Klaim tidak pernah dibatalkan: jika unduhan terputus, pemegang token klaim mengunduh ulang dalam jangka waktu yang tersedia, dan jika tidak, rahasia dimusnahkan tanpa pernah dibaca.
Mengapa memakai fragmen URL, bukan parameter query?
Parameter query dikirim ke server dan masuk ke log akses, proxy, dan analitik. Fragmen (setelah #) menurut spesifikasi URL tetap berada di sisi klien — browser tidak pernah memasukkannya ke permintaan HTTP. Sifat itulah yang menjadi dasar seluruh rancangan zero-knowledge. Setelah rahasia ditampilkan, halaman juga menghapus fragmen dari bilah alamat dan riwayat.
Apa yang mencegah pemindai tautan memusnahkan rahasia sekali lihat lebih awal?
Halaman tampilan adalah dokumen statis yang sama untuk setiap rahasia dan tidak mengambil apa pun saat dimuat. Permintaan hanya dikirim saat ada klik atau tekan tombol yang tepercaya — click() lewat skrip atau pengiriman formulir tidak dihitung. Pemindai otomatis (keamanan email, pratinjau tautan di chat, antivirus) hanya pernah memuat kerangka statis itu.
Bisakah saya memverifikasi atau meng-host sendiri layanan ini?
Bisa. Seluruh kode sumbernya publik di bawah AGPLv3, protokolnya ditulis dalam spesifikasi dengan vektor kesesuaian yang bisa dipakai implementasi mana pun untuk memeriksa dirinya sendiri, dan tersedia panduan hosting mandiri. Anda dapat mengaudit kriptografi di sisi klien dan menjalankan instans Anda sendiri sehingga batas kepercayaan sepenuhnya ada di tangan Anda.
Apakah ada yang dicatat untuk mencegah penyalahgunaan?
Kami tidak menyimpan log akses per rahasia atau riwayat IP. Pembatasan laju menggunakan hash berkunci dari alamat dengan salt yang dirotasi, dan setiap rotasi ikut menghapus semua penghitung. Laporan penyalahgunaan dihitung per hari; tidak ada catatan tentang rahasia mana yang dilaporkan.
Tips berbagi dengan aman
- Kirim frasa sandi lewat cara yang berbeda dari tautannya, misalnya tautan lewat email dan frasa sandi lewat telepon.
- Pilih masa kedaluwarsa terpendek yang masih memadai untuk Anda.
- Gunakan rahasia sekali lihat untuk kata sandi dan informasi lain yang semestinya dibaca tepat satu kali.
Melaporkan kerentanan
Jika Anda yakin telah menemukan masalah keamanan di situs ini, mohon kirim email ke [email protected] dan beri tahu kami secara pribadi sebelum memberi tahu orang lain. Sertakan apa yang Anda temukan dan cara mereproduksinya.
Kami akan:
- membalas dalam 5 hari kerja;
- terus mengabari Anda selama kami memperbaikinya;
- mencantumkan nama Anda saat kami merilis perbaikannya, jika Anda menginginkannya.
Saat melakukan pengujian, mohon jangan mengakses data orang lain, mengganggu layanan, atau menjalankan pemindaian otomatis yang membebaninya secara berat.
Kerentanan pada perangkat lunak shhnote itu sendiri: lihat kebijakan keamanan proyek.
Coba sekarang — hanya sepuluh detik
Tulis sesuatu yang rahasia, dapatkan tautan sekali pakai Anda, dan lihat rahasia itu lenyap.