it-swarm-id.com

Apakah GUID aman untuk token satu kali?

Saya melihat banyak situs menggunakan GUID untuk mengatur ulang kata sandi, berhenti berlangganan, dan bentuk identifikasi unik lainnya.

Agaknya mereka menarik karena mereka mudah dibuat, unik, tidak berurutan dan tampak acak.

Tapi apakah mereka cukup aman untuk tujuan ini?

Tampaknya bagi saya bahwa diberikan GUID, memprediksi GUID selanjutnya mungkin karena (sejauh yang saya tahu) mereka tidak dimaksudkan untuk aman secara kriptografi ... atau mereka?

Catatan:

  • Saya tidak berbicara tentang situs yang menggunakan gobbledygook acak yang disandikan dalam base64.
  • Saya berbicara tentang situs-situs seperti ini yang tampaknya menggunakan panduan mentah:
    http://example.com/forgotPassword/?id=b4684ce3-ca5b-477f-8f4d-e05884a83d3c
84
Michael Haren

Apakah mereka cukup aman untuk tujuan yang Anda jelaskan? Menurut saya, umumnya ya. Apakah mereka cukup aman dalam aplikasi di mana keamanan merupakan masalah yang signifikan? Tidak. Mereka dibuat dengan menggunakan algoritma non-acak, jadi mereka tidak dengan cara apa pun acak atau aman secara kriptografis.

Jadi untuk fungsi verifikasi berhenti berlangganan atau berlangganan, saya benar-benar tidak melihat masalah keamanan. Di sisi lain, untuk mengidentifikasi pengguna aplikasi perbankan online, (atau bahkan mungkin fungsi reset kata sandi dari sebuah situs di mana identitasnya berharga), GUID sudah pasti tidak memadai.

Untuk informasi lebih lanjut, Anda mungkin ingin memeriksa bagian 6 (Pertimbangan Keamanan) dari RFC 4122 untuk GUID (atau Pengidentifikasi Unik Universal).

42
Xander

The spesifikasi UUID merinci beberapa "versi" yang merupakan metode untuk menghasilkan UUID. Sebagian besar ditujukan untuk memastikan keunikan (itulah poin utama UUID) dengan menggunakan, misalnya, tanggal saat ini. Ini efisien tetapi berarti bahwa meskipun UUID yang dihasilkan unik, mereka juga dapat diprediksi, yang membuatnya tidak memadai untuk beberapa penggunaan keamanan.

Metode pembuatan UUID "versi 4" (pada bagian 4.4) , bagaimanapun, seharusnya menggunakan generator nomor acak kriptografis yang kuat. 6 dari 128 bit ditetapkan ke nilai konvensional (untuk menunjukkan bahwa ini adalah UUID versi 4, yaitu), jadi ini menyisakan 122 bit dari RNG.

Jika RNG yang mendasarinya aman (misalnya /dev/urandom Pada sistem Linux/MacOS/* BSD, atau CryptGenRandom() pada Windows) kemudian diberikan banyak UUID yang dihasilkan, penyerang tidak seharusnya dapat memprediksi yang berikutnya dengan probabilitas keberhasilan lebih tinggi dari 2-122, yang cukup kecil untuk sebagian besar keperluan, termasuk kode peluncuran untuk rudal nuklir.

122 bit acak memastikan keunikan dengan probabilitas tinggi. Jika Anda membuat banyak UUID versi 4 dan mengakumulasikannya, Anda mungkin akan menemui tumbukan pertama setelah sekitar 261 UUID - sekitar 2 milyar milyar; hanya dengan menyimpan jumlah UUID itu akan menggunakan lebih dari 30 juta terabyte. Jika Anda menganggap "hanya" 1012 UUID tersebut (seribu miliar, dapat disimpan lebih dari 16 terabyte), maka risiko memiliki dua UUID yang identik di antaranya adalah sekitar 9,4 * 10-14, yaitu sekitar 700 ribu kali lebih kecil kemungkinannya daripada memenangkan jutaan dolar di lotere.

Oleh karena itu, UUID are sesuai untuk tujuan keamanan if (dan hanya jika) mereka adalah "versi 4" UUID yang dihasilkan dengan RNG yang aman.

59
Thomas Pornin

Mereka aman di Windows 2000 atau yang lebih baru. Kerentanan & risiko Anda bergantung pada bagaimana GUID dihasilkan. Windows 2000 atau yang lebih baru menggunakan versi 4 dari GUID yang aman secara kriptografis.

Untuk informasi lebih lanjut, lihat tautan MSDN ini dan ini stack overflow question . (Terima kasih kepada Jordan Rieger di komentar)

5

Jika Anda menggunakan bahasa pengembangan umum yang membuat generator satu angka acak unik menggunakan fungsi kripto yang tepat tidak begitu sulit (kita berbicara tentang 10 baris kode yang tersedia sebagai sampel dalam bahasa yang paling umum hanya menggunakan Google ) dan dengan demikian menggunakan panduan baru sederhana itu pada dasarnya malas dari sudut pandang pengembang.

Dalam skenario yang dijelaskan mereka "cukup aman", jika Panduan yang dilewatkan dalam fungsi kata sandi yang dilupakan memiliki beberapa fitur dasar:

1) Ini benar-benar nilai sekali tembak yang tidak memiliki hubungan dengan id pengguna, jadi, setelah kata sandi diatur ulang, tidak dapat digunakan lagi

2) Ini memiliki rentang waktu yang ditentukan untuk validitasnya (Anda dapat mengatur ulang kata sandi dalam 30 menit berikutnya atau sesuatu seperti itu)

Jika menggunakan Panduan yang sama Anda dapat mengatur ulang kata sandi lebih dari sekali atau menebak kata petunjuk dan mengatur ulang kata sandi pengguna yang tidak meminta pengaturan ulang kata sandi atau, seperti yang dijelaskan Avid dalam komentar, cobalah untuk mendapatkan akses untuk mengatur ulang kata sandi menggunakan semacam replay attach maka desain aplikasi itu salah dan menggunakan atau tidak menggunakan Guid bukanlah masalah sebenarnya.

Jadi jika Anda tidak berurusan dengan informasi yang sangat sensitif maka mungkin panduan bisa bekerja, tetapi mengapa tidak membuat hal-hal dengan cara yang tepat pertama kali dan menggunakan api kripto yang tepat untuk menghasilkan string acak yang aman?

Salam Massimo

3
massimogentilini

Palsu "GUID", yang tidak dihasilkan oleh sembarang generasi algoritma GUID, tetapi yang hanya 128 bit (16 byte) yang dihasilkan oleh PRNG yang aman secara kriptografis, dan yang hanya diwakili menggunakan pengkodean GUID hex-with-hyphens konvensional, sebagian besar aman untuk token satu kali.

Anda memang mengalami masalah ulang tahun, karena keberadaan tabrakan sekitar 2 ^ -64 untuk token 128-bit.

Lebih baik menggunakan token 256-bit atau 512-bit, di mana keberadaan tabrakan adalah sekitar 2 ^ -128 atau 2 ^ -256.

0
yfeldblum