如何在Ruby中设置和使用SHA1哈希

时间:2014-01-22 22:57:09

标签: ruby security sha1

我意识到你可以在ruby中创建一个SHA1哈希,如下所示:

Digest::SHA1.hexdigest "foo"

但是,一旦代码被创建,你想用它做什么?我认为它很容易被劫持和妥协。添加此哈希的安全值在哪里?我错过了什么?

1 个答案:

答案 0 :(得分: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?

您可以安全地模糊网址,方法是要求没有人知道的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哈希做什么?


最后一点说明:

  

我认为它很容易被劫持和破坏。

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

简而言之,psuedocode安全哈希可能如下所示:

publically_sharable_hash = sha1(commonly_known_input + secret_salt)

这仅适用于非安全应用程序:(如上面的文件内容示例)

insecure_hash = sha1(commonly_known_input)

因为到达SHA1哈希的数学是众所周知的,所以当没有使用盐时,更容易知道输出的输入。

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