2008-09-15 3 views
16

Ich schreibe eine Web-App, die auf externe Links verweist. Ich möchte eine nicht sequenzielle, nicht erratbare ID für jedes Dokument erstellen, das ich in der URL verwenden kann. Ich habe das Offensichtliche getan: Die URL als String und Str # Crypt zu behandeln, aber das scheint an nicht-alphanumerischen Zeichen zu ersticken, wie die Schrägstriche, Punkte und Unterstriche.Was ist der beste Weg, um eine URL in Ruby zu hacken?

Haben Sie Vorschläge, wie Sie dieses Problem am besten lösen können?

Danke!

Antwort

35

Je nachdem, wie lange eine Zeichenfolge Sie möchten ein paar Alternativen verwenden:

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" 

Beachten Sie, dass dies nicht unguessable sein wird, Sie können es mit einigen anderen (geheim, aber statisch) Daten an Salz die Zeichenfolge kombinieren müssen:

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

Jetzt wird es viel schwieriger, diesen Hash für jemanden zu generieren, der den ursprünglichen Inhalt nicht kennt und keinen Zugriff auf Ihre Quelle hat.

0

Verwenden Digest::MD5 von Rubys Standardbibliothek:

Digest::MD5.hexdigest(my_url) 
3

Ich würde auch vorschlagen, die verschiedenen Algorithmen im Digest-Namespace zu betrachten. Um es schwieriger zu erraten, anstatt (oder zusätzlich zu) mit einem geheimen Passwort salzen, können Sie auch ein genaues Abbild der Zeit verwenden können:

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

Da das Ergebnis eines Hashing-Algorithmus ist nicht garantiert Seien Sie eindeutig, vergessen Sie nicht, die Eindeutigkeit Ihres Ergebnisses mit zuvor generierten Hashes zu überprüfen, bevor Sie davon ausgehen, dass Ihr Hash verwendbar ist. Die Verwendung von Time.now macht den Wiederholungsversuch trivial zu implementieren, da Sie nur aufrufen müssen, bis ein eindeutiger Hash generiert wird.

Verwandte Themen