【问题标题】:What is the SHA-1 of 255?255 的 SHA-1 是多少?
【发布时间】:2011-11-11 20:05:57
【问题描述】:

假设您有一个接受文本作为输入而不是字节数组的 sha-1 算法。 (例如有一些类似的 Javascript 库)。

如果您想将 sha-1 应用于文本(假设该文本是密码),那么您首先进行 utf-8 编码,因为该文本可以包含多字节字符。换句话说,文本中一个字符的对应整数值可以大于一个 8 位字节可以容纳的值。由于 sha-1 算法适用于 8 位单元,因此它有助于首先将文本编码为 utf-8。

我的问题是: 当您有一个每个字节的值在 0 到 255 之间的非文本二进制数据时,您是否仍然希望在将二进制数据传递给 sha-1 算法之前对其进行 utf-8 编码?我知道当值在 0 到 127 之间时,utf-8 根本不会修改数据。

但是,如果值介于 128 和 255 之间,则 UTF-8 会修改此类数据。

总之,这是我的问题:包含值 255(全为 1)的字节的 SHA-1 是什么?

With UTF-8 encoding:    730cf30d408ecf51aad876f5c491f837f7ddea4c

Without UTF-8 encoding: 85e53271e14006f0265921d02d4d736cdc580b0b

哪个是正确的?

【问题讨论】:

    标签: utf-8 sha1


    【解决方案1】:

    不,不要对二进制数据进行 UTF-8 编码,这没有任何意义。如果您想要一段二进制数据的哈希,您应该 完全采用 SHA-1,而不是对该数据进行一些随机转换。

    您也不应该对字符串进行 UTF-8 编码,除非您想要的是该字符串的 UTF-8 表示形式的 SHA-1

    【讨论】:

    • 如果这么清楚,为什么我在网络上遇到的所有 javascript 库都首先使用 UTF-8 编码?看到这两个:http://www.movable-type.co.uk/scripts/sha1.htmlhttp://plugins.jquery.com/files/jquery.sha1.js.txt
    • 这是一种“标准化”方法。假设您有两个用户在消息中向您发送“hé”。一位用户以 ISO-8859-1 格式发送,另一位用户以 UTF-16 格式发送。如果您要比较的是他们发送给您的字节(第一个字节为 2 个字节,第二个字节为 4 个字节),则在散列之前不要对输入进行任何转换。如果您要比较的是文本(“人类可理解”)内容,请选择一种编码,将所有输入编码为该“规范”编码,然后比较该通用表示的哈希值。
    • 我的问题是“我们是否对 sha1 进行标准化”?如果我们不这样做,图书馆为什么要这样做?
    • 规范化(通常)是文本数据的好主意。但对于二进制数据,它毫无意义。通过 UTF-8 编码方案(您会选择什么作为源编码)传递二进制文件根本不会对其进行规范化(它会破坏它)。您似乎认为“127 以上”的字符对 SHA 有特殊作用——事实并非如此。具有一个单字节且所有位都设置的二进制文件的 SHA-1 是 85e...您的另一个总和是一些完全不同的没有意义的东西的 SHA1。
    • 我理解你的回答,我即将结束这个问题,但你能告诉我你对为什么 JavaScript sha1 库默认执行 utf-8 编码的看法吗?请注意,javascript 中没有字节数据结构。因此,您必须将二进制数据表示为文本以将其传递给 sha-1 javascript 代码,因为字符串是此类库支持作为输入的唯一数据类型。
    猜你喜欢
    • 2011-05-24
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2016-02-26
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    相关资源
    最近更新 更多