我如何安全地假设SHA1哈希的一部分是单一的?

Thi*_*ère 9 security sha1

我目前正在使用SHA1来缩短网址:

Digest::SHA1.hexdigest("salt-" + url)
Run Code Online (Sandbox Code Playgroud)

仅使用SHA1的前8个字符作为唯一标识符是多么安全,就像GitHub明显提交的一样?

rsp*_*rsp 11

要计算具有给定长度的碰撞概率和您拥有的哈希数,请参阅生日问题.我不知道你将要拥有的哈希数量,但这里有一些例子.8个十六进制字符是32位,因此对于大约100个哈希,碰撞的概率大约为1/1,000,000,对于10,000个哈希,大约是1/100,对于100,000,它是3/4等.

请参阅维基百科上的生日攻击文章中的表格,以找到满足您需求的良好哈希长度.例如,如果您希望碰撞的可能性低于1/1,000,000,000(对于超过100,000个哈希值的集合),则使用64位或16个十六进制数字.

这一切都取决于你将拥有多少哈希以及你愿意接受的碰撞概率(因为总有一些概率,即使非常小).


Jer*_*fin 7

如果您正在谈论十六进制的SHA-1,那么每个字符只能获得4位,总共32位.碰撞的可能性与该最大值的平方根成反比,因此约为1/65536.如果您的URL缩短器被大量使用,那么在您开始看到冲突之前可能不会花费很长时间.

至于替代方案,最明显的可能只是维持一个反击.由于您需要存储URL表以将缩短的URL转换回原始URL,因此您基本上只需将每个新URL存储在表中.如果已经存在,则提供其现有编号.否则,您插入它并给它一个新的数字.无论哪种方式,您都可以将该号码提供给用户.