【发布时间】:2017-03-30 16:53:24
【问题描述】:
我需要一些基本的验证(卫生检查)来确定某些输入是有效的 SHA1 总和还是只是一个(随机)字符串。如果可能的话,使用简单的解析规则或正则表达式。
对于 SHA1 总和应该遵守什么规则有什么规定吗?我找不到任何内容,但从快速测试来看,所有内容似乎都是十六进制且大约 40 个字符长[1]。
我对证明 SHA-1 总和是否以安全、适当随机或其他方式进行的测试不感兴趣。只是格式正确。
我也对测试摘要是否是某些消息的实际表示不感兴趣;只是它首先具有摘要的格式。
对于好奇:这是针对我基于 a.o. 为用户构建头像的应用程序。他们的uuid。但是,我不想将这些 uuid 放在 URL 中,而是稍微混淆一下。所以我们请求avatars/5f2a13cb1d84a2e019842cdb8d0c8b03c9e1e414.png,而不是avatars/baa4833d-b962-4ab1-87c5-283c9820eac4.png。其中5f2a... 是例如Digest::SHA1.hexdigest(uuid + "secrect")。
在接收端,我添加了一些基本的保护措施,只要有明显的错误,就会发回400 bad request。如avatars/haxor.png 或avatars/traversal../../../../attempt.png。请注意,这是一个非常简化的示例。
[1] 两种结果不同的测试:
在 Ubuntu Linux 上使用 sha1sum:
$ echo "hello" | sha1sum | cut -d" " -f1 | wc -c
41
使用 Ruby 的文摘:
Digest::SHA1.hexdigest("hello").length
=> 40
编辑:原来这是我,很愚蠢,wc-c 包含换行符,正如 kennytm 在 cmets 中指出的那样。仍然:假设它总是 40 个字符是否安全?
【问题讨论】:
-
wc -c给出 41 仅仅是因为尾随换行符。 -
@kennytm:那么它总是 40 吗?这是在某个地方设定的标准吗?
-
SHA-1 generates 160-bit hash 所以十六进制表示总是 160 / 4 = 40 位长。
-
@kennytm,听起来
[a-f0-9]{40}足以验证格式,不是吗?