Neden bir UUID iyi bir fikir değil MD5'ing edilir?

6 Cevap php

PHP tür bir UUID üreten bir uniqid() işlevi vardır.

Kullanım örnekleri olarak, aşağıdakileri gösterir:

$token = md5(uniqid());

Ama yorumlarda, someone says this:

Generating an MD5 from a unique ID is naive and reduces much of the value of unique IDs, as well as providing significant (attackable) stricture on the MD5 domain. That's a deeply broken thing to do. The correct approach is to use the unique ID on its own; it's already geared for non-collision.

Eğer öyleyse neden bu, doğru mu? MD5 hash benzersiz bir kimliği için (neredeyse) tek ise, o zaman bir uniqid md5'ing gelen yanlış olan ne?

6 Cevap

Bir UUID 128 bit genişliğindedir ve oluşturulan şekilde teklik doğasında vardır. Bir MD5 hash 128 bit genişliğindedir ve çarpışma sadece düşük Olasılık uniquess garanti etmez. MD5 hash bu depolama yardımcı olmuyor yani UUID daha küçüktür.

Eğer karma bir UUID ait olduğunu biliyorsanız bunları geneerating makine hakkında bir şey biliyorsanız geçerli UUIDs bir etki aslında oldukça öngörülebilir çünkü saldırmak için çok daha kolaydır.

Eğer güvenli bir belirteç sağlamak için gerekli, o zaman bir cryptographically secure random number generator. (1) Uuıdlerin, kriptografik güvenli olacak şekilde tasarlanmış tek tek garanti edilmez kullanmak gerekir. Eğer belirteçleri dizisi tek bir UUID ters mühendislik eğer benzersiz bir makine tanımlayıcılar (tipik olarak bir MAC) ve zaman ile sınırlı bir tekdüze artan bir sıra hala mükemmel geçerli bir UUID ama çok tahmin edilebilir.

  1. Yani sayı ortaya değildir ve çıkarsanamayacağına jeneratör bazı gizli devlet var - şifreli olarak güvenli PRNG belirleyici özelliği, belirli bir yinelemenin sonucu sonraki yineleme değerini anlaması için yeterli bilgi içermiyor olmasıdır PRNG gelen bir sayı dizisi inceleyerek.

    If you get into number theory you can find ways to guess the internal state of some PRNGs from a sequence of generated values. Mersenne Twister, böyle bir jeneratörün bir örnektir. Bu uzun süre elde etmek için kullanılan bu durumu gizledi ancak kriptografik olarak güvenli değildir - bir sayı oldukça küçük dizi alır ve iç durumu anlaması için kullanabilirsiniz. Bunu yaptıktan sonra bir sır bu diziyi tutmaya bağlıdır bir şifreleme mekanizması saldırmak için kullanabilirsiniz.

O uniqid() bir UUID dönmez, ama şimdiki zamana dayalı bir "benzersiz" string Not:

$ php -r 'echo uniqid("prefix_", true);'
prefix_4a8aaada61b0f0.86531181

Eğer birden çok kez yaparsanız, çok benzer bir çıktı dizeleri ve uniqid() Kaynak algoritmasını tanıyacak aşina herkesi alırsınız. Bu yolu oluşturulacak sonraki kimlikleri tahmin etmek oldukça kolaydır.

Md5 avantajı ()-ing çıkışı, uygulamaya özgü tuz dize veya rasgele sayısı ile birlikte, dize tahmin etmek için bir yol daha zordur:

$ php -r 'echo md5(uniqid("prefix_", true));'
3dbb5221b203888fc0f41f5ef960f51b

uniqid() düz aksine, bu çok farklı çıktı her mikrosaniye üretir. Ayrıca bu başlık altında uniqid() kullanarak sizin "öneki tuz" dizesini REVEIL, ne değildir. Tuz bilmeden, bir sonraki kimliğini tahmin etmek (imkansız görüyorlar) çok zordur.

Özetle, ben commentor görüşüne katılmıyorum olur ve her zaman düz uniqid() üzerinde md5()-ed çıkış tercih ederim.

Uuıdlerin zaten benzersiz ve sabit uzunlukta (kısa), çünkü bir UUID MD5ing anlamsız, insanlar genellikle başlamak için MD5 kullanmak nedenlerinden bazılarıdır özellikleri. Yani bu UUID ile yapmayı planlıyorsanız ne bağlıdır varsayalım, ama genel bir UUID MD5'd olmuştur bazı veri olarak aynı özelliklere sahip, neden hem do?

Uuıdlerin zaten benzersiz olan, onları yine de öylesine MD5'ing hiçbir nokta yoktur.

Saldırgan sonraki benzersiz bir kimlik oluşturmak üzeresiniz ne olacağını tahmin edebilirsiniz eğer güvenlik sorununa ilişkin genel saldırıya olabilir. Eğer UUIDs adresinin benzersiz kimlikleri oluşturmak olduğu biliniyorsa, potansiyel sonraki benzersiz kimlikleri kümesi bir kaba kuvvet saldırısı için iyi bir şans vererek, çok daha küçüktür.

Saldırgan size benzersiz kimlikleri bir sürü alabilirsiniz eğer bu özellikle doğrudur, ve bu şekilde üreten UUIDs sizin düzeni sanırım.

Version 3 UUIDs zaten MD5'd, bu yüzden tekrar yapmanın hiçbir anlamı yok. Ancak, ben PHP kullandığı UUID sürümünü emin değilim.

Olarak bir kenara, MD5 aslında eski ve korunmaya değer bir şey kullanılmak üzere değil - PHI, PII veya PCI - 2010 yılından itibaren. ABD federaller bu ennforced ve uyumlu olmayan herhangi bir varlık cezası $ $ $ sürü ödeme olacaktır.