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

为什么在Python中hmac得到错误的结果而不是Perl?

  •  2
  • cobbal  · 技术社区  · 16 年前

    我正在尝试使用sha-512计算hmac。

    use Digest::SHA qw(hmac_sha512_hex);
    
    $key = "\x0b"x20;
    $data = "Hi There";
    
    $hash = hmac_sha512_hex($data, $key);
    print "$hash\n";
    

    并给出正确的

    87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cde  
    daa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854
    

    Python版本:

    import hashlib, hmac
    
    print hmac.new("\x0b"*20, "Hi There", hashlib.sha512).hexdigest()
    

    它给出的哈希值不正确

    9656975ee5de55e75f2976ecce9a04501060b9dc22a6eda2eaef638966280182
    477fe09f080b2bf564649cad42af8607a2bd8d02979df3a980f15e2326a0a22a
    

    编辑:

    Python 2.5.1(r251:54863,2009年1月13日,10:26:13)
    [GCC 4.0.1(苹果公司5465版)]关于达尔文

    4 回复  |  直到 16 年前
        1
  •  9
  •   popcnt    16 年前

    是的,的确如此——看来python2.5的Leopard版本已经崩溃了。

    下面是在基于Penryn的MBP上运行。。。

    $ **uname -a**
    Darwin lizard-wifi 9.6.0 Darwin Kernel Version 9.6.0: Mon Nov 24 17:37:00 PST 2008; root:xnu-1228.9.59~1/RELEASE_I386 i386
    dpc@lizard-wifi:~$ **which python**
    /usr/bin/python
    

    运行Leopard OS中安装的此版本

    dpc@lizard-wifi:~$ python
    Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hashlib, hmac
    >>> print hmac.new("\x0b"*20, "Hi There", hashlib.sha512).hexdigest()
    9656975ee5de55e75f2976ecce9a04501060b9dc22a6eda2eaef638966280182477fe09f080b2bf564649cad42af8607a2bd8d02979df3a980f15e2326a0a22a
    >>> 
    

    python2.5

    $ /opt/local/bin/python2.5
    Python 2.5.4 (r254:67916, Feb  3 2009, 21:40:31) 
    [GCC 4.0.1 (Apple Inc. build 5488)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import hashlib, hmac
    >>> print hmac.new("\x0b"*20, "Hi There", hashlib.sha512).hexdigest()
    87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854
    >>> 
    
        2
  •  1
  •   kquinn    16 年前

    我无法在这里复制您的结果。在空闲状态下,使用Python 2.5:

    Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information.
    
    ...
    
    IDLE 1.2.2      
    >>> import hashlib, hmac
    >>> print hmac.new("\x0b"*20, "Hi There", hashlib.sha512).hexdigest()
    87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854
    
        3
  •  0
  •   Greg Hewgill    16 年前

    Python的哪个版本?字符串在Python3中是Unicode的。这是一个Unicode问题吗?

        4
  •  0
  •   cobbal    16 年前


    我想问题出在旧版本上