Confidex
Bahagian

Bagaimanakah pelayan boleh menyimpan dan menyegerakkan rahsia kita tanpa memegang kekunci untuk membacanya? Kami akan mengikuti cara Confidex mencipta kuncinya, melindunginya dalam kunci dan menggunakannya untuk menyulitkan data dan mengesahkan perubahan.

Mangga

Hanya Yang Terpilih boleh membuka pintu

Matriks Dimuat Semula

Bayangkan bahawa kami sedang membina vault maya untuk menyimpan data rahsia. Ia mesti menyimpan data itu pada komputer riba selepas aplikasi ditutup dan membenarkan kami membukanya pada peranti lain. Bilik kebal memerlukan kuncinya sendiri. Kita mesti menyimpannya supaya penyalinan fail tidak memberi orang luar cara untuk membaca atau mengubah kandungannya.

A lock melindungi kunci: fail kecil yang disulitkan. Membukanya memerlukan kata laluan induk dan kod rahsia, secret_key; tidak ada dalam fail itu sendiri. Kami boleh mencetak keseluruhan kunci dalam akhbar pagi. Pembaca akan mendapat salinan, tetapi menerbitkannya tidak akan mendedahkan kunci peribadi.

Katakan orang luar mendapat fail ini dan juga mempelajari kata laluan induk. Mereka kini boleh mengulangi setiap pengiraan yang hanya memerlukan kata laluan, tetapi pengiraan tersebut tidak akan menghasilkan kunci yang membuka kunci: secret_key juga merupakan input. Fail tidak mengandungi semakan berasingan kata laluan sahaja. Membukanya masih memerlukan kod rahsia yang tidak diketahui.

Kod itu datang daripada data rawak kriptografi; seseorang tidak menciptanya. Selagi secret_key tidak diketahui, walaupun kata laluan induk yang diteka dengan betul tidak membuka kunci: penyerang masih tidak mempunyai rahsia rawak. Oleh itu, kata laluan yang lemah sahaja tidak menjadikan salinan pelayan menjadi serangan kamus praktikal.

Jika penyerang juga memperoleh secret_key, mereka boleh menguji tekaan kata laluan induk di luar talian. Ini mahal, tetapi kesukaran akhirnya bergantung pada kekuatan kata laluan.

Kunci

Tuan-tuan, apakah yang dilakukan oleh kunci? Kekunci… buka kunci sesuatu?

Pirates of the Caribbean - Dada Orang Mati

Aplikasi ini memperoleh 32 bait rawak daripada penjana kriptografi sistem pengendalian dan menyediakannya untuk digunakan sebagai kunci. Bait yang disediakan ini ialah kunci induk peribadi, master_key.

Aplikasi sentiasa memperoleh kunci yang sama daripada master_key: mengulangi pengiraan yang sama pada bait yang sama memberikan hasil yang sama. Oleh itu, komputer riba dan telefon boleh memulihkan kunci yang sama. Untuk mendapatkan master_key pada peranti baharu, aplikasi mesti membuka kunci dengan kata laluan induk dan secret_key.

Pasangan pertama: penyulitan

Saya ialah Jurukunci.

Ghostbusters

Untuk menyimpan data yang disulitkan, aplikasi mengira kunci awam daripada master_key: secret_key. Ia boleh menyulitkan data untuk peti besi, manakala penyahsulitan memerlukan master_key.

"Awam" menerangkan peranan kunci ini dalam algoritma, bukan kewajipan untuk memberikannya kepada semua orang. Dalam Confidex ia kekal dengan pengguna. Ia juga merupakan rahsia kedua yang diperlukan untuk membuka kunci, jadi ia kekal setempat dan tidak dihantar melalui rangkaian. Dengan sendirinya, secret_key membenarkan seseorang menyulitkan data untuk peti besi, tetapi tidak menyahsulitnya atau menandatangani perubahan bagi pihaknya.

X25519 ialah algoritma yang mengambil master_key dan mengira secret_key. Memulihkan master_key daripada secret_key hampir tidak dapat dilaksanakan. Serangan klasik ke atas superkomputer khayalan yang melakukan operasi lengkung bilion bilion sesaat akan mengambil masa kira-kira 2.3 trilion tahun secara purata (anggaran SafeCurves).

public bytes Random bytes32 bytes master_key secret_key public bytes Random bytes32 bytes master_key secret_key
Daripada bait rawak kepada kunci penyulitan.

Pasangan kedua: tandatangan

Satu-satunya perkara asal ialah tandatangan

Tangkap Saya Jika Anda Boleh

Pasangan pertama membantu menyembunyikan kandungan. Kami kini memerlukan satu cara untuk mengesahkan bahawa pemilik bilik kebal membenarkan perubahan. Pelayan mesti boleh menyemak tandatangan juga, jadi kami perlu menghantarnya kunci pengesahan awam. Bahagian awam pasangan pertama ialah secret_key, yang tidak boleh diterima oleh pelayan. Oleh itu, kami mencipta pasangan kunci kekal kedua untuk tandatangan.

Daripada menyimpan rahsia bebas yang lain, kami memperoleh kunci tandatangan peribadi daripada master_key dan memanggilnya signing_key. Aplikasi menggunakannya untuk menandatangani data dan kunci. Peranti lain dan pelayan menggunakan bahagian awamnya untuk menyemak tandatangan tanpa membaca kandungannya.

Kami boleh memulihkan pasangan ini daripada master_key yang sama. Aplikasi memperoleh nilai permulaan daripadanya: 32 bait yang secara unik menentukan kunci tandatangan.

Untuk memperoleh kunci yang berbeza untuk kerja yang berbeza, kami menyertakan label tetap dalam pengiraan: di sini, confidex/vault/ed25519/v1. master_key yang sama dan label yang sama sentiasa menghasilkan kunci yang sama.

Kata laluan induk belum memasukkan pengiraan ini. Kedua-dua pasangan bergantung pada bait rawak master_key, bukan pada rentetan yang dicipta oleh seseorang. Perbezaan ini akan menjadi penting kemudian: kata laluan akan melindungi akses kepada kunci yang sudah wujud, jadi kami boleh mengubahnya tanpa mengubah kunci itu sendiri.

Derivasi menggunakan fungsi terbitan kunci berasaskan cincang: HKDF, HMAC-based Extract-and-Expand Key Derivation Function. Confidex menggunakannya dengan SHA-256, maka dinamakan HKDF-SHA256. 32 bait yang terhasil ialah seed untuk pasangan Ed25519. Bahagian awam signing_key tidak mendedahkan secret_key, jadi kami boleh menghantarnya ke pelayan untuk pengesahan tandatangan.

public bytes HKDF-SHA256keymaster_keyinfo"confidex/vault/ed25519/v1" signing_key Signature verification public bytes HKDF-SHA256keymaster_keyinfo"confidex/vault/ed25519/v1" signing_key Signature verification
Kunci tandatangan yang berasingan, diperoleh daripada kunci induk yang sama.

Apakah fail kunci, dan apakah fungsinya?

Buka pintu ruang pod, HAL.
Maafkan saya, Dave. Saya takut saya tidak boleh berbuat demikian.

A Space Odyssey

Kunci menyimpan master_key yang disulitkan. Membukanya memerlukan kata laluan induk dan secret_key. Pengepala awam mengandungi versi format, pengecam bilik kebal, bahagian awam signing_key, garam dan parameter pemprosesan kata laluan. Versi format dalaman disulitkan bersama master_key.

Apabila membuat kunci, aplikasi sudah mempunyai master_key, jadi ia mengira secret_key sebelum penyulitan. Apabila membukanya, pengguna membekalkan secret_key secara berasingan: ia tiada dalam salinan awam kunci.

Selepas penyahsulitan, aplikasi mengira bahagian awam master_key menggunakan X25519 dan memerlukannya sepadan dengan secret_key. Ia kemudian memulihkan signing_key dan membandingkan bahagian awamnya dengan kunci dalam pengepala. Dengan cara ini, kunci menyemak sendiri.

Untuk memperlahankan tekaan kata laluan induk, setiap percubaan mesti memerlukan masa dan ingatan. Confidex menggunakan Argon2id dengan 64 MiB memori dan tiga pas. Pemprosesan kata laluan juga menggunakan garam rawak. Garam itu bukan rahsia: ia menjadikan kata laluan yang sama menghasilkan keputusan yang berbeza dalam kunci yang berbeza.

Jika secret_key sudah diketahui, panjang kata laluan mengubah skala serangan secara mendadak. Terdapat kira-kira 12 juta kombinasi 5 huruf kecil rawak Latin, kira-kira 8 bilion daripada 7, dan kira-kira 95 kuadrilion daripada 12. Daripada 7 kepada 12 huruf meningkatkan ruang carian hampir 12 juta kali. Jika mencari 7 huruf mengambil masa satu hari secara purata pada mesin tertentu, 5 akan mengambil masa kira-kira dua minit, dan 12 kira-kira 33,000 tahun.

Untuk mendapatkan satu kunci daripada hasil Argon2id dan secret_key, kami menggunakan fungsi HKDF-SHA256 yang diperkenalkan sebelum ini, dengan label confidex/lock/wrap/v1. Hasilnya ialah wrapping_key, kunci yang menyulitkan kunci.

Kita mesti menyembunyikan master_key dan melindunginya daripada gangguan. XChaCha20-Poly1305 menyulitkannya dengan wrapping_key dan menambah teg pengesahan. Teg mengikat teks sifir kepada pengepala awam: kata laluan yang salah atau perubahan pada bait yang dilindungi membuat pembukaan gagal. Teg dan nilai sekali guna rawak, nonce, disimpan dengan teks sifir.

Setiap kali kunci dibuat atau disulitkan semula, aplikasi memperoleh garam segar dan nonce. Kandungan yang disulitkan termasuk satu versi bait dan 32 bait master_key; teg 24 bait nonce dan 16 bait disimpan bersamanya. Dokumentasi algoritma menerangkan pembinaan.

Ketidakpadanan antara kunci yang dipulihkan boleh berpunca daripada kunci yang tidak betul bentuk atau pepijat dalam program yang menciptanya. Rasuah bait rawak biasanya dikesan lebih awal, apabila teg disemak.

Pelayan tidak mempunyai rahsia yang diperlukan untuk menyemak tag ini. Untuk memindahkan kunci, aplikasi itu menambah tandatangan yang dibuat dengan signing_key. Ia meliputi keseluruhan fail siap, termasuk pengepala awam dan kandungan yang disulitkan. Pelayan menyemak tandatangan dan, pada muat naik pertama, menyemat bahagian awam penuh signing_key dan pengecam peti besi dalaman. Ia menyemak perubahan seterusnya terhadap kunci ini. Kunci dan data yang disulitkan ditandatangani dengan signing_key yang sama, dipulihkan daripada master_key.

Bilik kebal

Kami kini boleh menerbitkan kunci. Hanya seseorang yang mengetahui secret_key dan master password boleh membaca master_key, manakala sesiapa sahaja boleh mengambil kunci tandatangan awam daripada fail kunci dan menyemak data yang ditandatangani tanpa melihat kandungan sama ada kunci atau data.

Pertimbangkan kata laluan, SuperPa55worD. Buat masa ini, kami hanya mahu menyimpannya: selepas menutup aplikasi, kami sepatutnya boleh menghantar fail kunci dan kata laluan yang disulitkan ke mana-mana tanpa sesiapa melihat SuperPa55worD, sambil masih membenarkan mereka mengesahkan kepengarangan kami. Penyulitan mesti boleh diterbalikkan apabila kami mempunyai secret_key dan master password. Sifir simetri boleh menyulitkan dan menyahsulit dengan kunci yang sama. Oleh kerana kita tidak menyimpan kunci itu, kita mesti dapat memulihkannya menggunakan kunci. Kami akan memanggilnya message_key.

Kami akan memperoleh message_key berasingan untuk setiap penyulitan baharu. Kita masih perlu mengatur pemulihannya: membiarkan kunci terbuka di sebelah teks sifir akan membenarkan sesiapa yang mempunyai salinan membaca segala-galanya.

Daripada bait rawak baharu, aplikasi mencipta pasangan X25519 sementara hanya untuk penyulitan ini: record_key. Ia kemudian mengambil bahagian peribadi record_key dan kunci awam kekal bilik kebal, secret_key dan mengira rahsia yang dikongsi. Fungsi berasingan memperoleh message_key daripada rahsia itu; kunci ini menyulitkan kata laluan kami.

Apabila membaca, aplikasi mengambil laluan lain. Ia menggunakan master_key dan bahagian awam record_key. Kedua-dua kunci ini menghasilkan rahsia kongsi yang sama. Secara matematik, kedua-dua laluan mendarab titik awal yang sama pada lengkung dengan dua nombor persendirian, dalam susunan yang berbeza. Pesanan tidak mengubah keputusan. Oleh itu, kami boleh memulihkan kunci penyahsulitan tanpa menyimpan bahagian peribadi record_key.

Mendapatkan rahsia ini daripada dua kunci awam adalah mustahil: mana-mana laluan memerlukan kunci peribadi yang sepadan. Mata awam tidak membenarkan kami memulihkan nombor peribadi yang menghasilkannya dengan cekap. Helah matematik ini menyokong keselamatan peti besi. Tetapi ia tidak menghalang seseorang daripada memberikan kami peti besi yang berbeza dengan kunci kami dilekatkan padanya.

Kini kami boleh menyimpan teks sifir bersama bahagian awam record_key. Bahagian peribadi record_key dan message_key yang digunakan tidak lagi diperlukan untuk bacaan akan datang. Kemudian, aplikasi mendapatkan semula kunci penyahsulitan daripada master_key dan bahagian awam record_key yang disimpan. Oleh itu, satu rahsia peti besi kekal boleh menyahsulit banyak nilai yang disulitkan secara berasingan, masing-masing dengan message_key sendiri yang dipulihkan apabila diperlukan.

Menyembunyikan teks tidak mencukupi: kita juga mesti mengesan gangguan semasa membacanya. Oleh itu, penyulitan menambah teg pengesahan, nilai pendek yang disemak bersama-sama dengan data yang disulitkan. Jika semakan gagal, permohonan menolak keputusan. Ia tidak boleh memaparkan teks rawak atau diubah sebagai kata laluan yang berjaya dinyahsulitkan.

public bytes Fresh random bytes record_key secret_key Shared secret Derive message key message_key Encrypted passwordpacket public bytes Fresh random bytes record_key secret_key Shared secret Derive message key message_key Encrypted passwordpacket
Pasangan kunci baharu untuk setiap penyulitan.

Kami telah menerangkan pembinaan di mana pasangan asimetri membantu mewujudkan rahsia kongsi, manakala message_key menyulitkan kandungan. Ini dipanggil Hybrid Public Key Encryption, atau HPKE, dan dinyatakan dalam RFC 9180. Confidex menggunakan X25519 untuk bersetuju dengan rahsia, HKDF-SHA256 untuk mendapatkan kunci dan ChaCha20-Poly1305 untuk penyulitan dengan semakan integriti. Di sini, HKDF mengambil rahsia kongsi yang dipersetujui menggunakan record_key dan pasangan master_key; ini adalah kerja yang berasingan daripada memperoleh Ed25519 seed. RFC 5869 menerangkan HKDF.

Untuk penyulitan seterusnya, aplikasi mencipta record_key baharu dan konteks HPKE baharu. Menggunakan semula gabungan message_key dan nonce memecahkan perlindungan sifir. Dalam Confidex, kunci dan nonce diperoleh di dalam HPKE, digunakan untuk satu mesej, dan kemudian konteksnya dibuang.

ChaCha20 sendiri menggunakan message_key 256-bit. Untuk merasakan serangan langsung, bayangkan superkomputer fiksyen menguji satu bilion bilion calon sesaat. Mencari kunci berkemungkinan 2²⁵⁶ akan mengambil masa kira-kira 1.8 × 10⁵¹ tahun. RFC 8439 menerangkan algoritma dan analisisnya.

Satu rekod

Kami gembira?

Fiksyen Pulp

Kami telah menyimpan kata laluan, tetapi log masuk ke tapak web biasanya juga memerlukan nama pengguna dan alamat. Kadang-kadang kita memerlukan nota di sebelah mereka. Jika kita menyimpan nilai ini secara berasingan, aplikasi mesti ingat bahawa ia adalah milik bersama. Mari kita masukkan "kertas" ini ke dalam sampul surat. Kami menggabungkan medan menjadi satu koleksi dan memanggilnya record.

Rekod boleh mengandungi sebarang gabungan medan. Aplikasi itu menghimpunkannya ke dalam satu paket, memampatkannya dan menyulitkan keseluruhannya menggunakan pembinaan yang baru sahaja kami terangkan. Nilai medan, nama, jenis dan teg semuanya dilindungi. Menukar alamat tapak web, walaupun sambil mengekalkan kata laluan yang sama, mencipta versi baharu bagi keseluruhan rekod, disulitkan dengan record_key baharu.

Hash-chain

PERLUKAH PROJEK ANDA MENGGUNAKAN RANTAI BLOCK? → TIDAK

XKCD 2267

Seseorang yang mengetahui secret_key boleh menyediakan rekod yang disulitkan untuk peti besi kami. Untuk mengelak daripada menerimanya sebagai milik kami, aplikasi menandatangani setiap versi rekod dengan signing_key. Tanpa kunci ini, orang luar tidak boleh mencipta versi dengan tandatangan yang akan diterima oleh pelayan dan peranti lain.

Versi yang disulitkan memerlukan beberapa maklumat yang disertakan: bilik kebal dan rekod miliknya, apabila ia berubah, dan versi mana yang mendahuluinya. Ini membentuk tajuk awam. Ia tidak mengandungi kata laluan, tetapi ia masih memerlukan perlindungan: jika tidak, seseorang boleh menukar pemilikan dan hubungan objek tanpa menyentuh teks sifir. Aplikasi menandatangani bait pengepala tepat bersama-sama dengan teks sifir. Menukar data yang ditandatangani akan membatalkan tandatangan.

Pelayan menyerupai gudang bungkusan tertutup. Ia melihat pengepala, kandungan yang disulitkan dan tandatangan, tetapi bukan kata laluan di dalamnya, dan ia tahu bahawa penerima wujud di bandar. Ia menyemak tandatangan terhadap bahagian awam yang disematkan signing_key dan memutuskan sama ada untuk menerima versi baharu. Ia tidak memerlukan kata laluan induk mahupun secret_key atau sebarang kunci peribadi. Apabila membaca, klien menyemak tandatangan yang sama, kemudian menyemak pengikatan antara kandungan dan pengepala sekali lagi semasa penyahsulitan, menggunakan teg pengesahan HPKE.

Tandatangan juga melindungi pautan antara versi. Cincang SHA-256 pengepala tepat dan bait teks sifir menjadi pengecam versi. Pengepala versi seterusnya mengandungi pengecam versi sebelumnya. Apabila kami menukar kata laluan tapak web, aplikasi mencipta dan menandatangani objek baharu dengan pautan ini. Objek lama dan tandatangannya kekal tidak berubah. Oleh itu, menggantikan pendahulu sambil mengekalkan tandatangan versi baharu akan gagal. Jika dua peranti membuat perubahan bebas, kedua-dua cawangan bertahan; versi gabungan boleh merujuk kepada kedua-duanya.

Ingat blockchain? Itu dia :-).

Pengepala awam membolehkan kami menyemak pautan tanpa menyahsulit, tetapi beberapa maklumat tetap kelihatan. Pelayan mengetahui pengecam, pautan versi, masa perubahan yang dibekalkan oleh klien, bilangan medan dan saiz dikodkan setiap nilai medan. Penyulitan menyembunyikan kandungan rekod, bukan maklumat struktur ini.

Header andparent IDs Encrypted recordpacket Sign revision signing_key Signed revision Header andparent IDs Encrypted recordpacket Sign revision signing_key Signed revision
Pengepala dan teks sifir ditandatangani bersama.

Penyegerakan

“Bukan kebocoran data, sandaran yang diedarkan secara percuma.”

meme internet.

Untuk bekerja pada beberapa peranti, kami perlu memindahkan kunci dan sejarah rekod antara peranti tersebut. Format objek tidak berubah: kami memindahkan bait dan tandatangan yang disulitkan yang sama yang disimpan secara setempat.

Untuk pemindahan manual, aplikasi mencipta arkib ZIP yang mengandungi kunci, semua versi rekod disulitkan yang disimpan secara tempatan dan senarai fail yang ditandatangani. Kata laluan mahupun secret_key tidak disertakan. Pada peranti lain, aplikasi mula-mula membuka kunci, kemudian menyemak tandatangan, menyahsulit rekod dan memulihkan salinan peti besi tempatan. Import bertujuan untuk peranti di mana bilik kebal ini belum wujud; ia tidak menggabungkan sejarah dengan salinan sedia ada.

Pelayan penyegerakan menukar perubahan antara salinan yang berfungsi. Pada muat naik pertama, ia menerima kunci yang ditandatangani, menyemak tandatangan dan mengira alamat peti besi awam daripada bahagian awam signing_key. Ia kemudian mengingati kunci ini dan pengecam peti besi daripada pengepala: ini mendaftarkan peti besi pada pelayan. Perubahan seterusnya mesti sepadan dengan pengecam ini dan membawa tandatangan daripada kunci yang sama.

Peranti baharu memerlukan alamat peti besi dan secret_key, jadi aplikasi menggabungkannya menjadi kod pemindahan dengan jumlah semak. Pengguna memindahkan kod ini ke peranti dan memasukkan kata laluan induk secara berasingan; hanya alamat awam dihantar ke pelayan.

Selepas membuka kunci yang dimuat turun, aplikasi membandingkan bahagian awam kunci yang dipulihkan dengan secret_key dan pengepala, dan menyemak alamat yang dikira dengan kod pemindahan. Ia kemudian menyimpan bahagian awam yang disahkan signing_key untuk menyemak rekod.

Semasa penyegerakan, aplikasi mengambil versi yang hilang dan memuat naik perubahannya. Pelayan menyemak tandatangan dan pautan ke versi sebelumnya, menyimpan objek yang diterima dan menghantarnya ke peranti lain. Menyemak data yang diterima, menyahsulitnya dan menyelesaikan konflik semuanya berlaku pada peranti pengguna.

Pendaftaran tidak meminta nama, alamat e-mel atau kata laluan berasingan. Pelayan melihat alamat awam, kunci pengesahan tandatangan, pengepala awam, saiz objek dan pautan versi. Ia juga melihat alamat IP dan masa permintaan. Kata laluan induk, secret_key, kunci peribadi dan kandungan rekod teks biasa kekal pada peranti pengguna. Sesiapa sahaja yang mengetahui alamat awam boleh memuat turun objek yang disulitkan, tetapi membacanya memerlukan rahsia pengguna.

Pemeriksaan ini mengesan objek palsu, tetapi tidak membuktikan bahawa pelayan telah menunjukkan sejarah lengkap dan keadaan terkininya. Ia boleh menyembunyikan cawangan yang pelanggan tidak pernah melihat atau mengembalikan set data lama yang konsisten. Tandatangan mengesahkan ketulenan objek individu, bukan kesempurnaan respons pelayan. Pengguna mungkin melihat tiada perubahan pada peranti lain, tetapi sejarah lama yang konsisten akan lulus pengesahan hash-chain.

Menukar kata laluan induk

Jadi, adakah Yang Mulia ingin menukar kata laluannya?

Penggodam (1995)

Menukar kata laluan induk menyulitkan semula kunci sahaja; master_key bahagian dalam kekal sama. Oleh itu, rekod, tandatangannya, secret_key dan alamat bilik kebal kekal tidak berubah. Kunci baharu ditandatangani dengan signing_key yang sama.

Salinan kunci lama masih dibuka dengan kata laluan lama dan secret_key yang sama; menukar kata laluan tidak membatalkan kunci yang telah didedahkan.

Gambar penuh

Kunci melindungi master_key, message_key menyulitkan rekod dan signing_key mencipta tandatangan. ZIP arkib dan pelayan menerima objek yang disulitkan dengan tandatangan.

public bytes public bytes public bytes master_key Fresh randombytes secret_key record_key Master password wrapping_key signing_key message_key lock Encrypted records Signed lockand records Signatureverification ZIP archive /sync server public bytes public bytes public bytes master_key Fresh randombytes secret_key record_key Master password wrapping_key signing_key message_key lock Encrypted records Signed lockand records Signatureverification ZIP archive /sync server
Kunci, perkara yang mereka lindungi, dan perkara yang boleh dikongsi.