1
我知道你可以在Ruby中创建一个SHA1哈希值,像这样:如何设置和使用SHA1哈希在Ruby中
Digest::SHA1.hexdigest "foo"
然而,一旦创建的代码是什么,你想用它做?我认为它可以轻易被劫持和妥协。添加此散列的安全性值在哪里?我错过了什么?
我知道你可以在Ruby中创建一个SHA1哈希值,像这样:如何设置和使用SHA1哈希在Ruby中
Digest::SHA1.hexdigest "foo"
然而,一旦创建的代码是什么,你想用它做?我认为它可以轻易被劫持和妥协。添加此散列的安全性值在哪里?我错过了什么?
你可以安全地存储密码,没有实际存储任何密码。
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字符的字符串,就好像在你生成的每个哈希上都有超级安全的加密密码。但是像任何密码一样,请确保它保密。
咦?如果你不需要散列,那么不要创建一个散列! –
你错过了哈希的用处。散列对于单向加密是很好的。哈希算法试图保证:没有两个文档生成相同的算法,并且不能将哈希反转为原始数据。您是否将数据库中的网站密码以明文形式存储?不,你存储他们的散列。当用户输入他的用户名/密码时,您会密码并在数据库中查找。当有人盗用你的数据库时,他只能窃取散列表。 – karatedog