如何检查SHA-1消息摘要的格式

时间:2017-03-30 08:35:22

标签: regex sha

我需要一些基本的验证(卫生检查)来确定某些输入是有效的SHA1总和还是只是一个(随机)字符串。如果可能的话,使用简单的解析规则或正则表达式。

SHA1总和应该遵守什么规则?我找不到任何东西,但是从快速测试来看,它们似乎都是十六进制的,长约40个字符[1]。

我对证明SHA-1总和是否以安全,适当随机或其他方式制作的测试不感兴趣。只是格式正确。

我也不感兴趣测试摘要是某些消息的实际表示;只是它首先具有摘要的格式。

对于好奇:这是一个应用程序,我根据a.o为用户构建头像。他们的uuid。但是,我不想将这些uuids放在URL中,而是将它们混淆了一点。因此,我们请求avatars/baa4833d-b962-4ab1-87c5-283c9820eac4.png而不是avatars/5f2a13cb1d84a2e019842cdb8d0c8b03c9e1e414.png。例如5f2a...的位置Digest::SHA1.hexdigest(uuid + "secrect")

在接收方,我正在添加一些基本保护,只要有明显错误,就会发回400 bad request。例如avatars/haxor.pngavatars/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 在评论中指出的那样。仍然:假设它总是40个字符是否安全?

1 个答案:

答案 0 :(得分:1)

SHA-1 has a 160 bits digest

160位渲染是160/8 = 20字节 以十六进制格式呈现的20个字节的长度为40个字符(数字),每个字节有两个字符。 数字可以是[0-9a-f]

因此,以下正则表达式应正确验证呈现为十六进制格式的字符串的Sha1sum:

/^[0-9a-f]{40}$/