Saya bermaksud menggunakan UNIQUEIDENTIFIER
sebagai kunci akses yang dapat digunakan pengguna untuk mengakses data tertentu. Kuncinya akan bertindak sebagai kata sandi dalam arti itu.
Saya perlu membuat beberapa pengidentifikasi seperti itu sebagai bagian dari INSERT...SELECT
pernyataan. Untuk alasan arsitektur saya ingin membuat pengidentifikasi sisi server dalam kasus ini.
Bagaimana saya bisa menghasilkan acak yang aman UNIQUEIDENTIFIER
? Catatan, itu NEWID
tidak akan cukup acak karena tidak menjanjikan properti keamanan sama sekali. Saya mencari SQL Server yang setara dengan System.Security.Cryptography.RandomNumberGenerator karena saya memerlukan ID yang tidak dapat diucapkan. Apa pun berdasarkan CHECKSUM
, RAND
atau GETUTCDATE
juga tidak memenuhi syarat.
4
. Tetapi fakta bahwa saya tidak memiliki bukti kuat bahwa mereka mungkin dapat ditebak bukan berarti tidak. Saya tidak bisa mendasarkan keputusan keamanan ini pada pengamatan ini.Jawaban:
Seharusnya melakukan trik yang saya pikir.
CRYPT_GEN_RANDOM
sumber
Hanya dua sen saya, tetapi ini mungkin bukan ide yang baik. Mengutip seri Eric Lippert yang luar biasa pada GUID ( bagian 1 , bagian 2 , bagian 3 ), akronimnya adalah GUID, bukan GSUID - Pengidentifikasi Unik Global, bukan Pengidentifikasi Unik Global Aman.
Masalahnya terletak pada ketika GUID dihasilkan dalam lingkup non-bermusuhan, seperti semua orang yang menggunakan NEWID (), semua nilai dijamin unik (well, semacam, lihat artikel Eric, bagian 3). Tetapi jika entitas bermusuhan memasuki ruang lingkup itu, mereka dapat memprediksi GUID yang dihasilkan berikutnya, serta menyebabkan tabrakan sendiri.
Dengan membuat metode Anda sendiri menghasilkan nilai yang Anda simpan di dalam struktur yang terlihat seperti GUID, pada dasarnya Anda telah menjadi entitas yang bermusuhan. Anda telah mengubah kontrak GUID dari menjadi unik menjadi acak . Sementara seseorang yang lebih baik dalam matematika daripada saya mungkin bisa membuktikan Anda masih unik, itu hanya dalam batas-batas metode generasi Anda. Jika Anda mencampur GUID semu ini dengan GUID NEWID (), semua taruhan dimatikan.
Saya mengatakan ini mungkin bukan ide yang baik hanya karena saya tidak tahu seluruh ruang lingkup bagaimana Anda menggunakan nilai-nilai tersebut. Jika Anda adalah satu-satunya entitas yang menghasilkan nilai (tidak ada campuran dan kecocokan), dan / atau Anda tidak mempertahankan nilai, dan / atau Anda tidak peduli dengan tabrakan, ini mungkin bukan masalah. Jika salah satu dari item itu tidak benar, Anda mungkin ingin mengevaluasi kembali.
sumber
UNIQUEIDENTIFIER
kebanyakan kebetulan. Lebih mudah untuk menangani kuantitas 16 byte menggunakan tipe itu. Saya menganggapnya sebagai kata sandi. Itu harus unik. Saya yakin bahwa saya tidak akan pernah melihat tabrakan (dan bahkan jika ada aplikasi hanya akan crash - jadi itu aman juga).Menurut https://blogs.msdn.microsoft.com/sqlprogrammability/2006/03/23/newafterentialid-histrorybenefits-and-implementation/ , fungsi NEWID () hanya membungkus fungsi Windows CoCreateGuid, yang mengembalikan GUID gaya v4, yang mengembalikan GUID gaya-v4 . Dan menurut https://msdn.microsoft.com/en-us/library/bb417a2c-7a58-404f-84dd-6b494ecf0d13#id11 , sejak Windows 2000 kembali pada tahun 1999,
Jadi saya katakan Anda dapat mempertimbangkan NEWID () aman secara kriptografis - setidaknya sejauh 122 bit entropi yang disediakannya.
sumber