代码之家  ›  专栏  ›  技术社区  ›  gbtimmon

为什么这些SHA1实现不同?

  •  -4
  • gbtimmon  · 技术社区  · 8 年前

    我的问题很简单——对于两个单独的SHA1实现,我是否可以保证为同一输入获得相同的输出,或者实现中是否有解释的空间?

    最具体地说,我的R摘要SHA1实现和我的PHPSha1摘要似乎没有像我希望的那样结合在一起。是因为我有一个bug,还是SHA1实现只是给同一消息提供了不同的有效哈希?

    在R中:

    digest_token = "Stackoverflow is Cool"
    value = digest(digest_token, "sha1", raw=FALSE)
    

    输出:

    [1] 4c 70 99 2f 81 b5 32 0d 77 aa 17 b6 da be 69 92 13 a0 44 9f
    

    在PHP中

    $digest_token= "Stackoverflow is Cool";
    $value = sha1($disgest_token, false); 
    

    输出

    ef48c200b5d9b844c950f7704e6c03359f8a4e2f
    

    我可能希望这两个产品产生相同的输出,但它们没有。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Artjom B.    8 年前

    这个 R digest package description 很清楚发生了什么(重点是我的):

    这个 digest 函数将加密哈希函数应用于任意R对象。 默认情况下 对象在内部序列化 ,以及当前实现的MD5和SHA-1哈希之一 函数算法可用于计算 序列化的对象 .

    为了将此实现与其他实现进行比较,输入参数的序列化也可以是 关闭此选项,其中输入参数必须是返回其摘要的字符串。

    以下代码生成与PHP代码相同的结果:

    digest_token = "Stackoverflow is Cool"
    value = digest(digest_token, "sha1", raw=FALSE, serialize=FALSE)
    
        2
  •  1
  •   Salvador Dali    8 年前

    是的,这正是拥有哈希函数的意义所在。如果每个人都可以实现相同的算法,并且有不同的结果,那么这个散列会有多大用处?

    该算法初始化一些变量,然后执行许多预定义的确定性“位改组”。虽然从理论上讲,通过更改这个初始化变量,您仍然可以使用SHA1逻辑,但没有人这样做。

    你可以看到这些 variables here (这只是我能找到的算法的一个实现)。

    digest[0] = 0x67452301;
    digest[1] = 0xefcdab89;
    digest[2] = 0x98badcfe;
    digest[3] = 0x10325476;
    digest[4] = 0xc3d2e1f0;