Enkripsi tanpa kata sandi

Dalam enkripsi modern, Anda memerlukan kunci/kata sandi/rahasia untuk dapat mengenkripsi/mendekripsi data dengan aman. Ini adalah ide di balik enkripsi simetris. Pada artikel ini, saya akan memandu Anda melalui bagaimana keamanan diberikan tanpa perlu mengingat kata sandi.

Bagaimana kita bisa mengenkripsi sesuatu?

Ada banyak cara untuk mengenkripsi sesuatu. Dalam hal menyimpan informasi Anda di Brankas, kami menggunakan metode enkripsi asimetris, yang disebut AES-256 (Standar Enkripsi Lanjutan).

Saat kami membuat brankas baru, kami membuat kunci rahasia baru dengan mereka. Ini kemudian akan digunakan untuk mengenkripsi semua data kami di brankas itu. Kami menggunakan string hex panjang 128 karakter sebagai rahasia kami (512 bit), yang jauh lebih aman, daripada kata sandi apa pun yang dapat kami ingat.

Kemudian kunci enkripsi ini disimpan di penyimpanan aman perangkat.

Inilah cara kerjanya dalam kode:

 // Generating a new secret const secret = generateSecret (); // Storing it in the device's secure storage await SecureStorage . store ( secret ); // This is the data, that we want to store const user = { platform : " dev.to " , email : " john@doe.com " , password : " secret123 " , }; // Then we encrypt the data const encrypted = AES . encrypt ( JSON . stringify ( user ), secret ); // Sending the user to the database // The safe is an object, where we want to store the item inside await API . item . create ( safe , encrypted ); // And finally, on a remote device, when we want to access the data, we use the secret to decrypt const decrypted = AES . decrypt ( encrypted , secret ); // It would print the original user object ({ platform: "dev.to", username.... }) console . log ( decrypted );

Catatan: ini hanya presentasi tentang cara kerjanya… Anda harus menganggapnya sebagai kode semu, bukan contoh kerja yang sebenarnya

Bagaimana kita bisa mentransfer kunci ini dari satu perangkat ke perangkat lain dengan aman?

Ini adalah salah satu yang rumit. Jika kami hanya mengirim kunci enkripsi melalui database kami tanpa enkripsi, itu berarti tidak ada gunanya enkripsi karena kami akan menyimpan kunci rahasia di sebelah data terenkripsi. Itu berarti Anda bisa menggunakan kunci itu untuk mendekripsi data yang disimpan dalam database.

Sebagai gantinya, kami menggunakan metode enkripsi asimetris, yang disebut RSA-2048. Saat Anda membuat kunci RSA baru, maka kunci tersebut menghasilkan pasangan kunci. Satu publik dan satu pribadi.

Yang publik hanya dapat digunakan untuk mengenkripsi data. Itu dapat dibagikan dengan aman di jaringan, karena tidak memberikan cara bagi penyerang potensial untuk mengambil data dari hash, karena tidak memenuhi syarat untuk itu.

Yang pribadi akan tetap berada di perangkat asli tanpa pernah membagikannya dengan perangkat lain. Kemudian ketika kami mendapatkan data dari server, kami dapat menggunakan kunci ini untuk mendekripsi hash yang kami terima.

Mari kita lihat, bagaimana cara kerjanya dalam praktik:

  1. Saat perangkat ditambahkan ke jaringan, kami membuat pasangan kunci ini dan mengirim kunci publik ke database. Itu akan disimpan di masa depan.
  2. Kami membuat brankas baru di salah satu perangkat kami dan menghasilkan rahasia, yang disimpan secara lokal.
  3. Kami meminta semua perangkat kami dari database dengan kunci publik RSA mereka.
  4. Kemudian kami mengenkripsi rahasia, yang kami buat pada langkah #2 dengan kunci ini.
  5. Kemudian kami menambahkan entri yang disebut KeyExchange, yang berisi informasi tentang perangkat dan brankas mana yang dimaksudkan untuk kunci dan rahasia terenkripsi.
  6. Akhirnya ketika kami menyegarkan data kami di perangkat lain, kami menanyakan semua pertukaran kunci kami dan mendekripsinya dengan kunci RSA pribadi kami.
  7. Setelah perangkat menerima kunci enkripsi, kami dapat dengan aman menghapus kunci dari database kami karena tidak lagi diperlukan.

Bagaimana saya bisa masuk dari perangkat lain?

Dibandingkan dengan sistem biasa, saat kita login, kita juga bertukar banyak data antara Authenticator dan perangkat Authenticated

Authenticator: Perangkat, yang sudah masuk.
Diotentikasi: Perangkat, yang ingin kita masuki, tetapi belum diautentikasi.

  1. Perangkat yang Authenticated menghasilkan pasangan kunci RSA dan mengirimkan sinyal ke server jauh untuk memulai proses otentikasi dengan kunci publik.
  2. Server jarak jauh kemudian menghasilkan id otentikasi (misalnya: ckqz9n52r000001la810jfjee ) dan rahasia (misalnya: 11879182178653d376fc6b129d1d315b ).
  3. Kemudian server menyimpan id dengan bcrypt dari rahasia dalam database dan mengirimkan kembali rahasia dan id ke perangkat yang Authenticated
  4. Perangkat yang Authenticated , kemudian menghasilkan kode QR, yang hanya menyimpan ID, yang didapat dari server.
  5. Sekarang di Authenticator , kami memindai kode QR ini. Ini akan mengirim sinyal ke server jarak jauh tentang siapa yang memindai kode QR (pertama).
  6. Pada Authenticated , kita akan melihat nama pengguna pengguna, yang memindai kode QR ini.
  7. Pada Authenticator , pengguna menekan tombol Verifikasi. Ini akan mengirim kunci enkripsi dari perangkat itu ke perangkat yang Authenticated (seperti dijelaskan di atas) dan ini juga akan mengirim sinyal, untuk mengizinkan server jarak jauh, untuk menghasilkan token akses dan token penyegaran untuk pengguna.
  8. Sementara hal-hal ini terjadi, Authenticated ping perangkat server, jika negara telah berubah. Jika proses autentikasi berhasil, maka hanya akan mengunduh semua data yang telah dikirim ke perangkat ini.
  9. Pada Authenticated , kami menggunakan kunci RSA pribadi, untuk mendekripsi kunci.
  10. Keuntungan! Kami telah berhasil mendapatkan access_token, refresh_token, membuat dan menukar kunci RSA, dan juga menerima semua kunci yang diperlukan, untuk mendekripsi brankas yang terkait dengan perangkat ini.

Pada perangkat yang Authenticated

 // Generate a public and a private RSA key const { publicKey , privateKey } = RSA . generate ( 2048 ); // Send this publicKey to the server and receive the id and the secret const { id , secret } = await API . authentication . start ({ publicKey , }); // Store the private RSA key for future use await SecureStorage . store ( " rsa_private_key " , privateKey ); // Check the server periodically for response setInterval ( async () => { const response = await API . authentication . check ({ id , secret , }); if ( response . state === " not_yet_scanned " ) { // If noone scanned the code yet do nothing } else if ( response . state === " scanned_but_not_verified " ) { // If the code has been scanned, but the code has not been verified just show the username for the user, to be able to verify, that they are allowing the right device in displayUsername ( response . user . username ); } else { // Finally, if everything has been sent and verified, we can do the real job for ( const exchange of response . keyExchanges ) { EncryptionKey . save ( exchange . safeid , RSA . decrypt ( exchange . content )); } AccessToken . save ( response . access_token ); RefreshToken . save ( response . refresh_token ); } }, 1000 );

Pada perangkat Authenticator

 // Initialize a new QR code scanner instance const scanner = new QRCodeScanner (); // Add an event listener for scan scanner . on ( " scan " , async ( id ) => { // Tell the remote server, that the QR code has been scanned on this device const { rsaPublicKey } = await API . authentication . onScan ( id ); // Show the username for the user await waitForVerification (); // Get all the encryption keys const keys = await EncryptionKeys . getAll (); // Iterate over all keys and encrypt them with the RSA key const enrypted = []; for ( const key of keys ) { encrypted . push ({ safeid : key . safeid , content : RSA . encrypt ( key . content , publicKey ), } } // Send the keys to the device await API . authentication . send ({ // The ID, that we scanned with the QR code id , encryptedKeys : encrypted , }); // Show success screen! showSuccessScreen (); }); // Show the QRCode scanner for the user scanner . start ();

Catatan: Kode ini juga hanya untuk tujuan demonstrasi, implementasi dapat bervariasi dari platform ke platform

Bagaimana jika saya kehilangan perangkat saya? Apakah saya akan kehilangan akses ke data saya?

Secara desain, itu akan terjadi. Tetapi kita dapat membuat kunci cadangan, yang dapat digunakan di masa mendatang, untuk mendapatkan kembali akses ke data kita setelah kehilangan ponsel.

Cadangan ini berfungsi seperti perangkat biasa karena secara teknis merupakan perangkat. Itu akan memiliki token penyegaran, untuk mendapatkan akses ke brankas kami dan itu akan memiliki kunci pribadi RSA, untuk mendekripsi pertukaran kunci yang dikirim ke sana. Ohh… dan juga, ketika kami membuat vault baru, kami akan mengirimkan pertukaran kunci ke kunci cadangan ini.

Dengan cadangan ini, kami dapat memberikan kemampuan, untuk mendapatkan akses setelah Anda kehilangan ponsel.

Terima kasih telah membaca!
Jika Anda memiliki pertanyaan, jangan ragu untuk menanyakannya di bawah.

Organisasi Github: github.com/wault-app
Perselisihan: discord.gg/NxhdAf4azz

July 11, 2021

codeorayo

Ampuh! Ini rahasia mengembangkan aplikasi secara instan, tinggal download dan kembangkan. Gabung sekarang juga! Premium Membership [PRIVATE] https://premium.codeorayo.com

Leave a Reply

Your email address will not be published. Required fields are marked *