2009-05-03 20 views

cevap

23

Öyle gibi uuid library kullanabilirsiniz:

 
import uuid 
my_id = uuid.uuid1() # or uuid.uuid4() 
+1

Aradığım şey bu! – Alex

+5

Ama bu çok rasgele değil. – Gumbo

+0

@Gumbo: Lütfen detaylandırın? – saffsd

1

Bu rastgele bir sayı oluşturmak kadar basit olabilir. Tabii ki, oturum kimliğinizi bir veritabanında veya bir şeyde saklamanız ve çoğaltılmadığından emin olmak için oluşturduğunuz her birini kontrol etmeniz gerekir, ancak sayıların yeterince büyük olması durumunda hiçbir zaman olmayacaktır.

+0

Tam olarak, Bu yüzden benim çözümüm: http://stackoverflow.com/questions/817882/unique-session-id-in-python/818040#818040 –

21
import os, base64 
def generate_session(): 
    return base64.b64encode(os.urandom(16)) 
+0

neden downmod? –

+1

Ben duno, ama bu geçerli bir çözüm gibi görünüyor. Bununla birlikte, "==" ifadesini kestirmenizi ve aynı zamanda daha az çarpışma şansı için bir zaman damgası eklemenizi tavsiye ederim. – Unknown

+1

4 milyar iterasyondan sonra bir çarpışma şansı 8 milyarda 1'dir.Eğer bir çarpışma ihtimalini azaltmak istersem, sadece os.urandom (32) bit sayısını arttırabilirim. Ve "==" izleyen sıranın ne anlama geldiğini anlamıyorum. –

1

Oturum ne için? Bir web uygulaması mı? the beaker module'a bakmak isteyebilirsiniz. Pylons'ta oturumları yürütmek için varsayılan modüldür.

73

GÜNCELLEME: 2016-12-21

Bir çok son ~ 5 yaş yaşandı. /dev/urandom güncellendi ve şimdi modern Linux çekirdeğinde ve dağılımlarında yüksek entropi bir rastlantısallık kaynağı olarak kabul ediliyor. Son 6 ayda, Ubuntu kullanarak bir Linux 3.19 çekirdeğinde entropi açlığını gördük, bu yüzden bu sorunun "çözüldüğünü" düşünmüyorum, ancak herhangi bir rastlantısallık istendiğinde düşük entropi rastlantısallığıyla sonuçlanmakta güçlük çekiyor. işletim sisteminden.


Bunu söylemekten nefret ediyorum ama burada yayınlanan diğer çözümlerden hiçbiri bir varlık açısından doğru "güvenli oturum kimliği."

# pip install M2Crypto 
import base64, M2Crypto 
def generate_session_id(num_bytes = 16): 
    return base64.b64encode(M2Crypto.m2.rand_bytes(num_bytes)) 

Ne uuid() veya os.urandom() oturum kimlikleri üretmek için iyi seçimlerdir. Her ikisi de rasgele sonuçları oluşturabilir, ancak rastgele zayıf nedeniyle güvenli olduğu anlamına gelmez. Bkz. "How to Crack a Linear Congruential Generator", Haldir veya NIST's resources on Random Number Generation.

Python atm en iyi OpenSSL API pyOpenSSL görünen M2Crypto edilir

# pip install pyOpenSSL 
import uuid, OpenSSL 
uuid.UUID(bytes = OpenSSL.rand.bytes(16)) 
# UUID('c9bf635f-b0cc-d278-a2c5-01eaae654461') 
olarak:

import uuid, M2Crypto 
uuid.UUID(bytes = M2Crypto.m2.rand_bytes(num_bytes))) 
# UUID('5e85edc4-7078-d214-e773-f8caae16fe6c') 

ya: hala bir UUID kullanmak istiyorsanız, o zaman iyi başlangıç ​​rasgele sayı ile oluşturulan bir UUID kullanmak sadece eski uygulamaları desteklemek için sürdürülmelidir.

+0

UUID sorunları hakkında yapılan atıflar faydalıdır. Bunu gönderdiğiniz için teşekkürler. Soru: Oturum kimliğini oluşturmanın en iyi yolu nedir? Özellikle UUID uygulamalarından alıntı yaptığınız hatalarla, bunu nasıl farklı bir şekilde yaparsınız? Şu an böyle bir şey yazıyor ve en iyi yaklaşımla ortaya çıkmaya çalışıyorum. Ayrıca, hataya dayanıklı olması gerekir - ör., Bir veritabanı sunucusuna bağlantıya bağlı olamaz. – ratsbane

+0

Yukarıdaki örneklerden herhangi biri işe yarayacaktır. Anahtar, "kriptografik olarak yeterli entropi" ile dolu iyi bir rasgele sayı üretecinden yararlanıyor. Estetiğin ve temsilin büyüklüğünün ötesinde, bir "Base64" dizesi veya bir "UUID", hatta bir hex kodlanmış dizgisi olarak yeterince rastgele bir değer kodlaması arasında bir fark yoktur. Her biri kendi başına. Ben şahsen temel nedenlerle base64'ü tercih ediyorum. – Sean

+0

Teşekkürler. Bu ses gibi görünüyor. Bu öğleden sonra – ratsbane

İlgili konular