2014-01-22 25 views
1

我知道你可以在Ruby中创建一个SHA1哈希值,像这样:如何设置和使用SHA1哈希在Ruby中

Digest::SHA1.hexdigest "foo" 

然而,一旦创建的代码是什么,你想用它做?我认为它可以轻易被劫持和妥协。添加此散列的安全性值在哪里?我错过了什么?

+2

咦?如果你不需要散列,那么不要创建一个散列! –

+0

你错过了哈希的用处。散列对于单向加密是很好的。哈希算法试图保证:没有两个文档生成相同的算法,并且不能将哈希反转为原始数据。您是否将数据库中的网站密码以明文形式存储?不,你存储他们的散列。当用户输入他的用户名/密码时,您会密码并在数据库中查找。当有人盗用你的数据库时,他只能窃取散列表。 – karatedog

回答

2

你可以安全地存储密码,没有实际存储任何密码。

def password=(new_password) 
    @hashed_password = Digest::SHA1.hexdigest(new_password + super_secure_salt) 
end 

def valid_password?(password) 
    @hashed_password == Digest::SHA1.hexdigest(password + super_secure_salt) 
end 

self.password = 'abc123' 
self.valid_password?('foobar') #=> false 
self.valid_password?('abc123') #=> true 

通过观察你可以识别文件如果二进制内容的哈希值是相同的东西,你见过之前:

FileRecord.where(sha: Digest::SHA1.hexdigest(some_file.read)).exists? 

你可以安全地混淆的URL需要sha1散列没有人知道,但只有少数人可以访问网站上的资源。

# GET /mysecurepages/1234?key=abcd1234abcd1234abcd1234 

@resource = Resource.find(params[:id]) 
if params[:key] == Digest::SHA1.hexdigest(@resource.id + super_secure_salt) 
    # allow access 
else 
    # deny access 
end 

还有很多很多其他的东西。你想用SHA1 hash做什么?


最后需要说明一下:

我想,这可以很容易地劫持和破坏。

它只能被劫持和妥协,如果你不使用盐(或盐不好)。盐就像是一个被包含在散列函数输入中的秘密。只要保密,SHA1的输入就很难从输出中找出。

简单伪码安全散列实力的样子:

publically_sharable_hash = sha1(commonly_known_input + secret_salt) 

如果这是仅适用于非安全应用非常有用:(像上面的文件内容例子)

insecure_hash = sha1(commonly_known_input) 

因为数学的到达SHA1散列是众所周知的,当不使用盐时,知道输出的输入要容易得多。

所以,如果你的盐是一个长32-64字符的字符串,就好像在你生成的每个哈希上都有超级安全的加密密码。但是像任何密码一样,请确保它保密。