如何检查 SHA-1 消息摘要的格式
How to check formatting of a SHA-1 message-digest
我需要一些基本的验证(卫生检查)来确定某些输入是有效的 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 在评论中指出的那样。仍然:假设它总是 40 个字符是否安全?
SHA-1 has a 160 bits digest
渲染的 160 位是 160 / 8 = 20 字节。
以十六进制格式呈现的 20 个字节的长度为 40 个字符(数字),每个字节两个字符。
数字可以是 [0-9a-f]
因此,以下正则表达式应正确验证呈现为十六进制格式字符串的 Sha1sum:
/^[0-9a-f]{40}$/
我需要一些基本的验证(卫生检查)来确定某些输入是有效的 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 在评论中指出的那样。仍然:假设它总是 40 个字符是否安全?
SHA-1 has a 160 bits digest
渲染的 160 位是 160 / 8 = 20 字节。
以十六进制格式呈现的 20 个字节的长度为 40 个字符(数字),每个字节两个字符。
数字可以是 [0-9a-f]
因此,以下正则表达式应正确验证呈现为十六进制格式字符串的 Sha1sum:
/^[0-9a-f]{40}$/