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 3
我以為你搞出來了一個輪子.....能把 Python 轉換成 PHP........我心想這 tmd 也太牛逼了........
|
2
whusnoopy 2019-05-22 08:09:12 +08:00 1
一步一步看结果,不懂 php,但是感觉第二句最后 h.digest() 和 md5($h) 是不等价的
|
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; 应该是这样吧 |
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= ``` |
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 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 |