首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

求助 Python 的语法转换成 PHP 该 怎么写?

  •  
  •   Steps · 27 天前 · 1494 次点击

    python 代码如下:

    h = hmac.new(args.acesskey_secret, args.method + "\n"+ args.date + "\n"+ args.uri, sha1)
    Signature = base64.b64encode(h.digest())
    

    我在网上找的方法

    $h = hash_hmac("sha1", $method . "\n" . $date . "\n" . $uri, $acesskey_secret);
    $Signature = base64_encode(md5($h));
    

    还是不错,请问哪里出问题了

    17 回复  |  直到 2019-05-22 17:08:58 +08:00
        1
    reechangs   27 天前 via Android   ♥ 3
    我以為你搞出來了一個輪子.....能把 Python 轉換成 PHP........我心想這 tmd 也太牛逼了........
        2
    whusnoopy   27 天前   ♥ 1
    一步一步看结果,不懂 php,但是感觉第二句最后 h.digest() 和 md5($h) 是不等价的
        3
    airdge   27 天前   ♥ 1
    import hmac
    import hashlib
    import base64
    string = "1234567890"
    key = "1234512345"
    h = hmac.new(key.encode(),string.encode(),hashlib.sha1)
    Signature =base64.b64encode(h.digest())
    print(Signature)

    $str = '1234567890';
    $key = '1234512345';
    $h = hash_hmac("sha1", $str, $key, true);
    $Signature = base64_encode(($h));
    echo $Signature;
    应该是这样吧
        4
    Takamine   27 天前 via Android
    @reechangs 我也以为是这样。23333
        5
    ben1024   27 天前   ♥ 1
    ```
    <?php
    $method = 'getData';
    $date = '2019-05-22';
    $uri = 'https://github.com/ElapseAnnals/LaravelPlus';
    $acesskey_secret = 'xxxxxxxxx';

    $h = hash_hmac("sha1", $method . "\n" . $date . "\n" . $uri, $acesskey_secret);
    $signature = base64_encode(md5($h));
    echo $signature; // 输出 NjE1OWFhOWMyN2Q0NzdiYTg5ZmExYmQ0NTUyOWQxMTQ=
    ```
        6
    lwb   27 天前
    3 楼正解
        7
    cszchen   27 天前 via Android
    多了 md5,人家只加密一次,你来了两次
        8
    Steps   27 天前
    @airdge #3 $Signature = base64_encode(($h));

    2 个括号是认真的吗?

    我貌似生成出来的签名还是不对
    @lwb #6 3 楼 貌似不对。。

    请注意我的
    ```
    args.method + "\n"+ args.date + "\n"+ args.uri
    ```

    是这样的,基本多了换行符的。

    3 楼 2 个代码运行出来的内容是一样的吗?
        9
    Steps   27 天前
    @cszchen #7 只是多了 md5 ?

    但是生成出来的签名是无法认证的。。
        10
    Steps   27 天前
    @airdge #3 b64encode 和 b64decode 一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为 base64 编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为 4 的整数,而+和 /在一些情况下需要被替换的,b64encode 和 b64decode 正是提供了这样的功能。

    查到这个, 是不是 php 还要进行一下字符过滤什么的
        11
    ysc3839   27 天前 via Android
    因为 PHP 的 hash_hmac 把结果转换成了 hex string。
    base64_encode(hex2bin($h));
    先转换回来,再 base64 就可以了。
        12
    ysc3839   27 天前 via Android
    @ysc3839 更正:看了 PHP 的文档发现 hash_hmac 有个 raw_output 的参数,不需要手动转回来。
    https://www.php.net/manual/en/function.hash-hmac.php
        13
    Steps   27 天前
    @ysc3839 #11 所以我的代码问题出在哪里了?
        14
    ysc3839   27 天前 via Android
    @Steps 没有设置 raw_output = TRUE.
        15
    Steps   27 天前
    @ysc3839 #14 设置了,貌似没有什么用。不晓得我问题出在哪里了
        16
    ysc3839   27 天前 via Android
    @Steps 发代码来看看。
        17
    airdge   27 天前   ♥ 2
    @Steps
    import hmac
    import hashlib
    import base64
    string = "测试"+"\n"+"2019-05-21"+"http://www.v2ex.com/";
    key = "1234512345"
    h = hmac.new(key.encode(),string.encode() ,hashlib.sha1)
    Signature =base64.b64encode(h.digest())
    print(Signature)

    输出:b'tKagsQb99N6lv4gFBDkysbEeFXc='

    $str = "测试" . "\n"."2019-05-21" . "http://www.v2ex.com/";
    $key = '1234512345';
    $h = hash_hmac("sha1", $str, $key, true);
    $Signature = base64_encode($h);
    echo $Signature;

    tKagsQb99N6lv4gFBDkysbEeFXc=

    和加不加"\n"又没关系
    还有 hash_hmac 第三个参数已经设置为 true 了,不需要在手动 hex2bin
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2156 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 15:58 · PVG 23:58 · LAX 08:58 · JFK 11:58
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1