Benzersiz anahtar üretimi

13 Cevap php

Özellikle ben her zaman benzersiz bir anahtarı almak için garantili olacak PHP, bir yol arıyor.

Ben aşağıdaki yaptım:

strtolower(substr(crypt(time()), 0, 7));

Ama arada bir ben (nadiren, ama yeterince sık) yinelenen bir anahtar ile sona bulduk.

Ben de yapmayı düşündüm:

strtolower(substr(crypt(uniqid(rand(), true)), 0, 7));

Uniqid () aynı mikrosaniye iki kez denir Ama eğer PHP web sitesine göre, uniqid (), aynı anahtarı oluşturmak olabilir olabilir. Düşünüyorum ki rand eklenmesi () nadiren olurdu, ama yine de bu mümkün.

Bu kullanıcı için daha az kafa karıştırıcı yüzden yukarıda belirtilen satırlardan sonra ben de böyle L ve O gibi karakterleri kaldırmak duyuyorum. Bu çiftleri nedeni belki de bir parçası, ama yine de gereklidir.

Ben bir düşünce var bir seçenek, anahtar üretecek bir web sitesi oluşturarak, bir veritabanında saklanması, tamamen benzersiz sağlamaktır.

Başka herhangi bir düşünce? Zaten API çeşit var ya da sadece anahtarını iade bunu yapmak orada herhangi bir web siteleri vardır. Ben buldum http://userident.com ama ben tuşları tamamen benzersiz olacak emin değilim.

Bu herhangi bir kullanıcı girişi olmadan arka planda çalıştırmak gerekiyor.

13 Cevap

Vb benzersiz değerleri oluşturmak için sadece 3 yolu, daha doğrusu onlar şifreleri olması, kullanıcı kimlikleri vardır:

  1. Etkili bir GUID jeneratör kullanın - bu uzun ve çekmiş olamaz. Eğer sadece bir kısmını kullanıyorsanız you FAIL.
  2. Sayısının en azından bir kısmı ardışık olarak tek bir dizi kapalı oluşturulur. Bunu az sıralı görünmesi için kabartmak veya kodlamayı ekleyebilirsiniz. Avantajı, kısa başlayın - dezavantajı tek bir kaynağı gerektirir olduğunu. Tek bir kaynak sınırlaması için etrafında çalışma kaynakları numaralandırılmış olması, böylece [kaynak #] + [seq #] ve sonra her kaynak kendi dizisine üretebilir içerir.
  3. Diğer bazı yollarla onları oluşturmak ve daha sonra önceden oluşturulan değerlerin tek tarihine karşı onları kontrol edin.

Başka bir yöntem garanti edilmez. Unutmayın, temelde ikili bir sayı (bir bilgisayar) üreten, ama sonra onaltılık, onluk, Base64, ya da bir sözcük listede kodlamak. Kullanımınızı uygun bir kodlama seçin. Genellikle kullanıcı girilen veriler için (sen ima) Base32 bazı varyasyon istiyorum.

Note about GUIDS: Onlar kendi uzunluğundan teklik gücünü ve bunları oluşturmak için kullanılan yöntem kazanırlar. Anything less than 128-bits is not secure. rasgele sayı üretimi ötesinde daha benzersiz yapmak için bir GUID gitmek özellikleri vardır. Tamamen özgün, sadece pratik olarak benzersiz değildir unutmayın. Pratik olarak imkansız bir kopyasını olması rağmen, mümkündür.

Updated Note about GUIDS: Bu yazı bu yana birçok GUID jeneratörler şifreli olarak güvenli rasgele sayı üreteci (zor veya imkansız oluşturulan bir sonraki sayıyı tahmin etmek, ve tekrar bir olası değil) kullanın öğrendim. 5 farklı UUID algorithms aslında vardır. Algoritma 4 Microsoft şu anda Windows GUID nesil API için kullandığı şeydir. A GUID UUID standardının Microsoft'un uygulamasıdır.

Update: Eğer 7-16 karakter istiyorsanız o zaman yöntem 2 ya da 3 ya da kullanmak gerekir.

Bottom line: Açıkçası gibi tamamen benzersiz bir şey yoktur. Eğer sonunda kendinizi geri döngü ve yinelenen dolayısıyla, evrendeki tüm atomlar kullanılarak depolama tükendi sıralı bir jeneratör ile gitti bile. Sizin tek umut bu noktaya ulaşmadan önce evrenin ısı ölümü olurdu.

Hatta en iyi rasgele sayı jeneratör üreten rasgele sayının toplam boyutuna eşit yinelenen bir olasılık var. Örneğin dörtte al. Tamamen rastgele bit jeneratör ve yinelenen onun oran 2'de 1.

Yani hepsi aşağı teklik senin eşiğine gelir. Bunu bir diziyi kullanarak ve ardından base32 kodlama tarafından 1.099.511.627.776 numaraları için 8 haneli 100% teklik olabilir. Geçmiş numaralarının bir listesini karşı kontrol içermeyen herhangi bir başka yöntem yalnızca n / 1.099.511.627.776 eşit oran vardır (burada üretilen önceki sayıların n = sayı) benzersiz olmak değil.

Any algorithm will result in duplicates.

Bu nedenle, sana * mevcut algoritmayı kullanmak ve sadece çiftleri kontrol önerebiliriz?

* Hafif ekleme: uniqid() zamana dayalı olmayan benzersiz olması durumunda, ayrıca her çağırma sonra artırmak küresel bir sayaç bulunmaktadır. Bu şekilde bir hatta aynı mikrosaniye farklıdır.

Kod yazmadan, benim mantık olacaktır:

Generate a random string from whatever acceptable characters you like.
Then add half the date stamp (partial seconds and all) to the front and the other half to the end (or somewhere in the middle if you prefer).

Stay JOLLY!
H

Özgün yöntemi kullanabilirsiniz, ancak şifre önünde adı ya da email eklerseniz her kullanıcı sadece 1 şifre var eğer, her zaman benzersiz olacaktır.

Aynı konu ile ilgilenen bu yazıda ilginizi çekebilir: GUIDs are globally unique, but substrings of GUIDs aren't.

Bu algoritmanın amacı teklik anahtar olarak (orada görelilik meraklılarının için "uzay-zaman koordinatları") zaman ve mekan kombinasyonunu kullanmaktır. Ancak, zaman işleyişi mükemmel değildir, bu nedenle, örneğin, iki Guıd, aynı makineden peş peşe damgası aynı olurdu o zaman birbirine çok yakın oluşturulan bir olasılık var. Uniquifier devreye giriyor bulunuyor

Ben genellikle bu gibi yapın:

$this->password = '';

for($i=0; $i<10; $i++)
{
    if($i%2 == 0)
        $this->password .= chr(rand(65,90));
    if($i%3 == 0)
        $this->password .= chr(rand(97,122));
    if($i%4 == 0)
        $this->password .= chr(rand(48,57));
}

Ben bazı teorik delikler vardır herhalde ama ben çoğaltılması ile bir sorunu olmadı. Ben genellikle (bir parola sıfırlama sonra gibi) geçici şifreler için kullanmak ve bunun için yeterince iyi çalışır.

Frank Kreuger yorumladı, bir GUID jeneratör ile gitmek.

Gibi this one

Parolalar benzersiz olması hala neden göremiyorum? Kullanıcıların 2 aynı parolayı varsa dezavantajı nedir?

Bu, biz sadece benzersiz tanımlayıcı değil kullanıcı kodları bağlı olan parolalar bahsediyoruz ve konum üstleniyor. that's aradığınız ne, neden Guıd'lerini kullanmak değilse?

Eğer bir şifre üreticisi Steve Gibson'un over-the-top-güvenli uygulama ilginizi çekebilir (hiçbir kaynak, ama nasıl çalıştığını ayrıntılı bir açıklama var) https://www.grc.com/passwords.htm de.

Site çok büyük 64-karakter şifreleri oluşturur ama, tamamen rastgele konum beri, kolayca daha az güvenli ama "mümkün olduğunca rastgele" parola ilk 8 (ya da ancak çok) karakterler alabilir.

EDIT: Daha sonra cevaplara Ben daha bir şifre daha GUID gibi bir şey bakın yani bu muhtemelen istediğiniz değil ...

Ben sorunu bu kısmı iki ayrı kullanır ... şifreler ve TRANSACTION_ID için bize bir tekil işlev çalışıyor olmasıdır inanıyorum

Bu gerçekten iki farklı sorun alanları vardır ve gerçekten birlikte bunları gidermek için denemek için iyi değildir.

Geçenlerde bu yüzden aşağıdaki yaptım hızlı ve basit rastgele benzersiz bir anahtar istedi:

$ukey = dechex(time()) . crypt( time() . md5(microtime() + mt_rand(0, 100000)) );

Yani, temelde, ben saniye unix zaman alır ve zaman + rasgele sayı oluşturulan rasgele bir MD5 dize ekleyebilirsiniz. Bu iyi değil, ama düşük frekanslı istekleri için oldukça iyidir. Bu hızlı ve eserleri bulunuyor.

Ben tuşlarının binlerce oluşturmak ve daha sonra tekrarlar için bakmak ve orada hiçbir tekrarlar vardı, o kadar kötü değil saniyede yaklaşık 800 tuşları sahip istediğiniz bir test yaptım. Ben tamamen mt_rand bağlıdır sanırım ()

Biz dakikada yaklaşık 1000 anketler bir gönderme hızı nereden hiçbir çiftleri vardır (parmaklarını geçer) şimdi yani ... bir anket izci için kullanabilirsiniz. Tabii ki, oran sabit değildir (biz günün belirli saatlerinde başvuru olsun) bu yüzden ... uç (benim durumumda anahtarının bir parçası olarak artan değeri kullanarak kanıt ne de en iyi çözüm başarısız değil I) zamanı () kullanılır, ama daha iyi olabilir.

Ben genellikle bu birini kullanmak eşsiz bir değer yaratarak ile yapmak çok yok crypting bölümünü Ingoring:

function GetUniqueValue()
{
   static $counter = 0; //initalized only 1st time function is called
   return strtr(microtime(), array('.' => '', ' ' => '')) . $counter++;
}

Aynı süreç $ sayaç çağrıldığında bu yüzden değeri aynı süreçte her zaman benzersiz artar.

Farklı süreçlerde denilen zaman () aynı değerler ile 2 arama microtime almak gerçekten şanssız olmalı, microtime () aynı script çağrıldığında genellikle de farklı değerlere sahip çağırır olduğunu düşünüyorum.

Ben genellikle rastgele bir alt dize (kullanıcı rahatlığı için 8 bir 32 ya da daha az arasında kaç karakter rastgele) ya da kazanılmış bazı değerinin MD5, veya zaman veya bazı kombinasyonu yapmak. Daha fazla rastgelelik için ben gelip değerinin MD5 do (soyadınızı söyleyin) zamanla, MD5 tekrar, daha sonra rastgele altdizesine almak bağlamak. Evet, could eşit şifreleri olsun, ama onun çok büyük olasılıkla hiç değil.