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));
还是不错,请问哪里出问题了
![]() | 1 reechangs 2019-05-22 07:56:59 +08:00 via Android ![]() 我以你搞出了一子.....能把 Python 成 PHP........我心想 tmd 也太牛逼了........ |
![]() | 2 whusnoopy 2019-05-22 08:09:12 +08:00 ![]() 一步一步看结果,不懂 php,但是感觉第二句最后 h.digest() 和 md5($h) 是不等价的 |
3 airdge 2019-05-22 08:28:37 +08:00 ![]() 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; 应该是这样吧 |
5 ben1024 2019-05-22 10:03:50 +08:00 ![]() ``` <?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 2019-05-22 10:25:16 +08:00 3 楼正解 |
![]() | 7 cszchen 2019-05-22 13:43:29 +08:00 via Android 多了 md5,人家只加密一次,你来了两次 |
![]() | 8 Steps OP |
![]() | 10 Steps OP @airdge #3 b64encode 和 b64decode 一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为 base64 编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为 4 的整数,而+和 /在一些情况下需要被替换的,b64encode 和 b64decode 正是提供了这样的功能。 查到这个, 是不是 php 还要进行一下字符过滤什么的 |
![]() | 11 ysc3839 2019-05-22 15:41:11 +08:00 via Android 因为 PHP 的 hash_hmac 把结果转换成了 hex string。 base64_encode(hex2bin($h)); 先转换回来,再 base64 就可以了。 |
![]() | 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 |
17 airdge 2019-05-22 17:08:58 +08:00 ![]() @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 |