求助 Python 的语法转换成 PHP 该 怎么写? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
Steps
V2EX    程序员

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

  •  
  •   Steps 2019-05-22 07:53:50 +08:00 3710 次点击
    这是一个创建于 2340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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
    reechangs
        1
    reechangs  
       2019-05-22 07:56:59 +08:00 via Android   3
    我以你搞出了一子.....能把 Python 成 PHP........我心想 tmd 也太牛逼了........
    whusnoopy
        2
    whusnoopy  
       2019-05-22 08:09:12 +08:00   1
    一步一步看结果,不懂 php,但是感觉第二句最后 h.digest() 和 md5($h) 是不等价的
    airdge
        3
    airdge  
       2019-05-22 08:28:37 +08:00   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;
    应该是这样吧
    Takamine
        4
    Takamine  
       2019-05-22 08:29:58 +08:00 via Android
    @reechangs 我也以为是这样。23333
    ben1024
        5
    ben1024  
       2019-05-22 10:03:50 +08:00   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=
    ```
    lwb
        6
    lwb  
       2019-05-22 10:25:16 +08:00
    3 楼正解
    cszchen
        7
    cszchen  
       2019-05-22 13:43:29 +08:00 via Android
    多了 md5,人家只加密一次,你来了两次
    Steps
        8
    Steps  
    OP
       2019-05-22 15:00:18 +08:00
    @airdge #3 $Signature = base64_encode(($h));

    2 个括号是认真的吗?

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

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

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

    3 楼 2 个代码运行出来的内容是一样的吗?
    Steps
        9
    Steps  
    OP
       2019-05-22 15:07:05 +08:00
    @cszchen #7 只是多了 md5 ?

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

    查到这个, 是不是 php 还要进行一下字符过滤什么的
    ysc3839
        11
    ysc3839  
       2019-05-22 15:41:11 +08:00 via Android
    因为 PHP 的 hash_hmac 把结果转换成了 hex string。
    base64_encode(hex2bin($h));
    先转换回来,再 base64 就可以了。
    ysc3839
        12
    ysc3839  
       2019-05-22 15:46:01 +08:00 via Android
    @ysc3839 更正:看了 PHP 的文档发现 hash_hmac 有个 raw_output 的参数,不需要手动转回来。
    https://www.php.net/manual/en/function.hash-hmac.php
    Steps
        13
    Steps  
    OP
       2019-05-22 15:51:10 +08:00
    @ysc3839 #11 所以我的代码问题出在哪里了?
    ysc3839
        14
    ysc3839  
       2019-05-22 15:52:54 +08:00 via Android
    @Steps 没有设置 raw_output = TRUE.
    Steps
        15
    Steps  
    OP
       2019-05-22 16:03:55 +08:00
    @ysc3839 #14 设置了,貌似没有什么用。不晓得我问题出在哪里了
    ysc3839
        16
    ysc3839  
       2019-05-22 16:06:11 +08:00 via Android
    @Steps 发代码来看看。
    airdge
        17
    airdge  
       2019-05-22 17:08:58 +08:00   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
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4697 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 05:37 PVG 13:37 LAX 22:37 JFK 01:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86