PHP hash_hmac与Python hmac

今天为俺开发钉钉群自定义机器人ding-bot(PHP)增加签名支持,参考官方文档钉钉开发文档

签名机制如下:

#python 3.8 
import time
import hmac
import hashlib
import base64
import urllib.parse

timestamp = str(round(time.time() * 1000))
secret = 'this is secret'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)

示例加密代码是python hmac

hmac.new(key, msg=None, digestmod=None)
  • key 使用的密钥
  • msg 要进行哈希运行的消息
  • digestmod 哈希算法 参考:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/hmac.html

与之对应的是php hash_hmac

hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] )
  • $algo 哈希算法名称,例如:"md5","sha256","sha1" 等。 如何获取受支持的算法清单,请参见 hash_algos()
  • $data 要进行哈希运行的消息
  • $key 使用的密钥
  • $raw_output 设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串

因此PHP实现以上签名如下:

$timestamp = time()*1000;
$secret = 'this is secret';
$stringToSign = $timestamp."\n".$secret;
$hmacCode = hash_hmac('sha256',$stringToSign,$secret,true);
$sign = urlencode(base64_encode($hmacCode));
var_dump($timestamp);
var_dump($sign);

 欢迎大家关注我的钉钉机器人ding-bot https://github.com/hbh112233abc/ding-bot 支持ThinkPHP6的日志通道哦:)

 

你可能感兴趣的:(PHP)