gpt4 book ai didi

Python HMAC-SHA256 签名与 PHP 签名不同

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:21 24 4
gpt4 key购买 nike

我搜索并发现了一些问题,这些问题有点解决了我想要完成的任务,但我似乎无法完全确定这一点。我是编程新手,正在尝试以几种语言(PHP、Ruby、Perl、C#)复制供应商提供给我的一些代码。我已经获取了 PHP 代码,并尽力在 Python 中复制它,并且除了这个签名函数之外,一切都正常工作。基本上,我必须获取用户通过 Web 表单传入的一组数据,对其进行签名,然后将其发送到 Web 服务监听器进行处理。尽我所能,我无法使签名值匹配。不幸的是,供应商除了他们的示例之外不提供任何代码级支持,所以我在那里运气不好。这是 PHP 示例:

<?php

define ('HMAC_SHA256', 'sha256');
define ('SECRET_KEY', 'secret_key_redacted');

function sign ($params) {
return signData(buildDataToSign($params), SECRET_KEY);
}

function signData($data, $secretKey) {
return base64_encode(hash_hmac('sha256', $data, $secretKey, true));
}

function buildDataToSign($params) {
$signedFieldNames = explode(",",$params["signed_field_names"]);
foreach ($signedFieldNames as &$field) {
$dataToSign[] = $field . "=" . $params[$field];
}
return commaSeparate($dataToSign);
}

function commaSeparate ($dataToSign) {
return implode(",",$dataToSign);
}

?>

这样调用:

<?php
foreach($params as $name => $value) {
echo "<input type=\"text\" id=\"" . $name . "\" name=\"" . $name . "\" value=\"" . $value . "\"/>\n";
}

echo "<input type=\"text\" id=\"signature\" name=\"signature\" value=\"" . sign($params) . "\"/>\n";
?>

这是我在 Python 中用来尝试复制的内容:

def payment_confirmation(self, *args, **kw):
vars = cherrypy.request.params #takes POST parameters from previous page
del vars['submit'] #removed so it doesnt get signed - part of POST from prev. page

def sign_data(vars):
for key, value in vars.iteritems():
yield "%s=%s," % (key, value)

sign_payload = ''.join(sign_data(vars)).rstrip(',')
sign_signature = hashlib.sha256(sign_payload + secret_key).digest().encode('base64')

这是我尝试签名的数据示例(简化为通过 Python 代码中的 sign_data() 方法返回的对象:

access_key=12345,reference_number=123456789,currency=USD,locale=en,profile_id=1234567,transaction_type=authorization,signed_date_time=2013-07-22T16:30:43Z,amount=25.00,transaction_uuid=0dc4a151-f2ec-11e2-bb29-005056c00008,payment_method=card,signed_field_names=access_key,profile_id,transaction_uuid,payment_token,signed_field_names,signed_date_time,locale,payment_method,transaction_type,amount,reference_number,currency,payment_token=0000000000000000

我意识到这是一个不太可能的事情,但是有人发现我的 Python 签名方法与 PHP 中提供的方法有什么明显不正确的地方吗?我认为这可能是 PHP 函数对键值对进行编码的一种方式,所以我尝试在 Python 代码中修改它,但它似乎不起作用。提前致谢!

最佳答案

如果您仍然困惑于这个问题,您可能想尝试使用:

sign_signature = base64.b64encode(hmac.new(secret_key, sign_payload, hashlib.sha256).hexdigest())

这里的关键是使用hexdigest()而不是digest()

就我而言,我花了 2 个小时来找出为什么 Python 在尝试使用新的“应用程序 secret 证明”签署 Facebook API 请求时没有产生与 PHP 相同的结果。

关于Python HMAC-SHA256 签名与 PHP 签名不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17793194/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com