
Saya baru-baru ini berpartisipasi dalam Ethereum hackathon, dan hari ini saya ingin berbicara tentang proyek EtherAuth, yang dengannya tim MixBytes menempati posisi ketiga. EtherAuth adalah upaya untuk membuat versi terdesentralisasi dari login situs menggunakan akun eksternal. Sebagai tombol, masuk melalui Facebook, hanya tanpa Facebook.
Masalah dan solusi
Jika Anda ingin membuat area tertutup untuk pengguna di situs web Anda, Anda harus memilih: mengembangkan sistem Anda sendiri untuk mengidentifikasi, mengautentikasi, dan mengotorisasi pengguna, atau menggunakan solusi yang sudah jadi. Solusi turnkey berarti bahwa pengguna Anda sudah memiliki akun di beberapa sistem (Facebook, Google, Yahoo, Outlook, atau bahkan hanya email). Dan Anda menggunakan mekanisme yang sesuai (paling sering protokol OAuth 2.0) untuk memastikan bahwa seseorang yang mencoba masuk ke situs Anda menggunakan ID pengguna eksternal adalah pengguna ini.
Opsi terakhir lebih mudah diterapkan, tetapi ada risiko bagi pengguna: jika terjadi sesuatu pada akun utamanya (misalnya, Facebook akan memblokir akun tanpa memberikan alasan), ia juga akan kehilangan akses ke informasinya di situs Anda.
Selain itu, jika sebagai pengguna saya ingin masuk ke situs yang belum saya percayai, saya dihadapkan pada kebutuhan untuk memberikan situs ini akses ke informasi pribadi saya, seperti email atau usia. Jika situs hanya mendukung masuk dengan akun eksternal, saya benar-benar harus membuat pilihan: menolak untuk menggunakan situs atau mengorbankan anonimitas saya.
Sebagian besar pengguna akhirnya mengorbankan anonimitas dengan kata-kata "jadi apa yang buruk bisa terjadi, saya tidak perlu menyembunyikannya." Sayangnya, sebagian besar serangan yang menargetkan pengguna yang tidak siap dan berakhir dengan kehilangan uang dimulai dengan kata-kata yang serupa. "Apa yang mengerikan bisa terjadi jika saya mengirim kode dari SMS ke karyawan bank?" "Hal buruk apa yang bisa terjadi jika saya mengirim karyawan dukungan teknis header permintaan?" Jawaban untuk pertanyaan ini paling sering ditemukan ketika tidak ada yang bisa dilakukan.
Bagaimana Ethereum dapat membantu di sini? Kami sudah menyadari bahwa ada tiga masalah utama:
- Pengguna tidak wajib mempercayai situs yang ia kunjungi dan ingin menghindari kebocoran informasi pribadi.
- Situs ini ingin menggunakan sistem otentikasi eksternal untuk menghindari penyimpanan data pengguna dan biaya keamanan terkait.
- Sistem eksternal yang ada yang menyediakan situs dengan kemampuan untuk mengotentikasi pengguna membawa bahaya sensor. Setiap akun dapat diblokir kapan saja tanpa penjelasan dan kadang-kadang tanpa kemungkinan pemulihan.
Kita dapat menggunakan jaringan Ethereum daripada sistem eksternal dan hanya menyimpan set data yang diperlukan di dalamnya. Kita harus berhati-hati untuk tidak menyimpan informasi rahasia dalam domain publik, tetapi karena dompet apa pun di jaringan Ethereum sebenarnya adalah sepasang kunci yang kuat secara kriptografis, di mana kunci publik menentukan alamat dompet dan kunci pribadi tidak pernah dikirimkan melalui jaringan dan hanya diketahui oleh pemiliknya, kami kita dapat menggunakan enkripsi asimetris untuk mengotentikasi pengguna.
Dalam kasus paling sederhana, Anda dapat menggunakan alamat dompet Ethereum sebagai ID pengguna. Tapi di sini muncul masalah: jika terjadi kebocoran kunci, pengguna kehilangan akses ke sistem selamanya. Lebih tepatnya, sejak saat kunci rahasia pengguna diketahui oleh penyerang atau secara tidak sengaja jatuh ke akses publik, kami tidak dapat menggunakan kunci semacam itu untuk otentikasi.
Implementasi
Dalam solusi kami, saya menulis kontrak pintar EtherAuth sederhana untuk menyimpan ID pengguna dan alamat dompet yang terkait. ID pengguna hanya berupa string UTF-8 yang berukuran antara 2 dan 32 byte. Itu diciptakan sekali oleh pengguna sendiri dan kemudian digunakan untuk masuk ke situs apa pun yang mendukung EtherAuth. Hari ini saya akan menambahkan batasan pada karakter yang mungkin termasuk dalam string, meninggalkan kemungkinan menggunakan karakter Latin dan angka Arab (himpunan bagian dari pengkodean ASCII 7-bit) untuk membatasi kemampuan untuk membuat login yang mirip secara lahiriah.
Saat membuat akun di EtherAuth, sepasang kunci diatur: kunci otorisasi (authAddr) dan kunci untuk memulihkan akses (recoveryKey). Nama recoveryKey tidak sepenuhnya berhasil, karena alamat ini digunakan untuk mengelola akun, dan bukan hanya untuk pemulihan. Saat membuat, kedua alamat sama dengan alamat dompet atas nama transaksi yang dikirim. Tetapi pengguna yang peduli dengan keselamatannya harus membuat kunci kontrol terpisah dan menyimpannya di tempat yang tidak dapat diakses melalui jaringan. Saya bahkan akan menyimpannya di atas kertas di brankas dalam bentuk 12 kata mnemonik, yang memungkinkan, jika perlu, membuat ulang beberapa kunci.
Juga bijaksana untuk menggunakan alamat dompet yang terpisah untuk otentikasi, memisahkannya dari alamat dompet tempat semua Ether Anda disimpan. Hubungan authKey dengan alamat dompet yang membuat akun masih dapat dilacak dengan menganalisis urutan transaksi dari kontrak pintar. Sekarang Anda tidak dapat menetapkan authKey dan recoveryKey yang terpisah saat membuat akun. Namun, jika Anda menyaring kontrak pintar ke arah ini, alamat yang membuat akun tidak harus dikaitkan dengan pemilik akun, yang akan memungkinkan semua orang untuk melindungi anonimitas mereka.
Untuk interaksi pengguna dengan kontrak pintar, kami membuat halaman web terpisah. Anda dapat membuat akun di sana, mengubah kuncinya, atau menghapusnya. Agar berfungsi, pengguna perlu menginstal plugin browser MetaMask. Jika Anda sudah aktif menggunakan jaringan Ethereum, kemungkinan besar Anda telah menginstal plugin ini, yaitu mayoritas pengguna yang ingin memasuki situs melalui Ethereum tidak akan menemui hambatan tambahan di jalurnya.
Proses otentikasi pengguna umum menggunakan EtherAuth terlihat seperti ini:
- Situs (backend) berubah menjadi kontrak pintar dan menerima alamat Ethereum pengguna;
- Situs (backend) menghasilkan dan mengingat beberapa pesan dan meminta pengguna untuk menandatangani pesan ini menggunakan alamat authKey;
- Pengguna, yang berada di situs (frontend), menandatangani pesan menggunakan plugin MetaMask dan mengirimkannya ke backend;
- Situs (backend) memverifikasi tanda tangan, dan jika semuanya beres, itu akan mengaktifkan sesi pengguna sesuai dengan logika yang dipilih.
Dalam solusi kami untuk hackathon, untuk kesederhanaan, kami menggabungkan bagian backend dan frontend, kami mendapat satu frontend besar. Dalam kehidupan nyata, verifikasi otentikasi harus dilakukan di lingkungan yang tidak dikontrol oleh pengguna, yaitu, bukan di browser, tetapi di server.
Dari masalah yang kami temui, kami dapat mencatat verifikasi tanda tangan di bagian frontend. Tidak ada dukungan untuk kurva eliptik di browser, jadi saya harus menambahkan fungsi ke kontrak pintar yang mengembalikan hasil ecrecover dari pesan dan belajar cara menyampaikan parameter ke sana dengan benar (mendapatkannya dari pesan yang ditandatangani oleh MetaMask).
Sebagai hasilnya, dalam dua hari kami menerima konsep pembuktian otentikasi terdesentralisasi menggunakan jaringan Ethereum dan plugin MetaMask. Kami memahami cara memperbaiki sistem ini untuk menambahkan anonimitas kepada pengguna. Pengguna dapat memulihkan akses jika terjadi kebocoran kunci primernya (tetapi tidak jika terjadi kebocoran kunci pemulihan). Sistem desentralisasi tidak tunduk pada sensor struktur besar seperti Google atau Facebook. Jika sensor diperlukan, situs harus melakukannya sendiri, tetapi dapat melakukan ini hanya dalam kerangka sistemnya sendiri, tanpa mempengaruhi akses pengguna ke sistem lain. Jaringan Ethereum tidak melakukan transaksi dengan sangat cepat (saat membuat akun, pengguna mungkin harus menunggu beberapa menit), tetapi dimungkinkan untuk mendapatkan data dan memverifikasi otentikasi pengguna dengan sangat cepat. Solusi ini berskala baik, karena ada banyak node dengan data, dan siapa pun dapat menambahkan satu lagi kapan saja. Kompleksitas penerapan solusi semacam itu untuk pemilik situs tidak lebih tinggi dari kompleksitas penerapan dukungan untuk OAuth 2.0.
Kesimpulan
Tentu saja, saat ini pengguna yang menggunakan jaringan Ethereum dapat diabaikan dibandingkan dengan jumlah pengguna Facebook. Namun, popularitas teknologi blockchain sedang tumbuh, dan saya percaya bahwa di masa mendatang akan ada semakin banyak pengguna seperti itu, yang berarti akan mungkin untuk menggunakan otentikasi terdesentralisasi dalam sistem industri.
Referensi