2008-09-15 33 views
16

Dış bağlantılara işaret eden bir web uygulaması yazıyorum. URL'de kullanabileceğim her doküman için sıralı olmayan, tahmin edilemez bir kimlik oluşturmayı düşünüyorum. Açık olanı yaptım: url'yi bir dize olarak ve str # crypt olarak ele alıyorum, ancak bu, eğik çizgi, nokta ve alt çizgi gibi herhangi bir alfasayısal olmayan karakterde boğuşuyor gibi görünüyor.Ruby'de bir url almanın en iyi yolu nedir?

Bu sorunu çözmenin en iyi yolu üzerinde herhangi bir öneriniz var mı?

Teşekkürler! Ruby'nin standart kütüphanesinden

cevap

35

Eğer birkaç alternatifleri kullanabilirsiniz istiyorum ne kadar bir dize bağlı:

require 'digest' 
Digest.hexencode('http://foo-bar.com/yay/?foo=bar&a=22') 
# "687474703a2f2f666f6f2d6261722e636f6d2f7961792f3f666f6f3d62617226613d3232" 

require 'digest/md5' 
Digest::MD5.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22') 
# "43facc5eb5ce09fd41a6b55dba3fe2fe" 

require 'digest/sha1' 
Digest::SHA1.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22') 
# "2aba83b05dc9c2d9db7e5d34e69787d0a5e28fc5" 

require 'digest/sha2' 
Digest::SHA2.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22') 
# "e78f3d17c1c0f8d8c4f6bd91f175287516ecf78a4027d627ebcacfca822574b2" 

Not

bu tahmin edilemeyen olmayacağını, dize tuzlamak için diğer (gizli ama statik) verilerle birleştirmeniz gerekebilir:

salt = 'foobar' 
Digest::SHA1.hexdigest(salt + 'http://foo-bar.com/yay/?foo=bar&a=22') 
# "dbf43aff5e808ae471aa1893c6ec992088219bbb" 

Şimdi, orijinal içeriği bilmeyen ve kaynağınıza erişimi olmayan bir kişi için bu karma üretmek için çok daha zor hale geliyor.

3

Ayrıca, özet ad alanındaki farklı algoritmalara bakmanızı öneririm. garanti edilmez herhangi müzakere algoritmasının sonucu beri

require 'digest/md5' 
def hash_url(url) 
    Digest::MD5.hexdigest("#{Time.now.to_f}--#{url}") 
end 

: zor (veya ek olarak) gizli bir parola ile tuzlama, ayrıca kesin bir süre dökümü kullanabilirsiniz ziyade, tahmin etmek yapmak için benzersiz olun, hashınızın kullanılabilir olduğunu kabul etmeden önce, daha önce üretilen karmalara karşı sonucunuzun benzersizliğini kontrol etmeyi unutmayın. Time.now kullanımı, yeniden deneme öneminin uygulanmasını sağlar, çünkü yalnızca benzersiz bir karma oluşturuluncaya kadar aramanız gerekir.

İlgili konular