资讯专栏INFORMATION COLUMN

PHP hash 接口对接

kel / 2506人阅读

摘要:另外说到请求对方接口的问题,对方要求传递一个参数过去,比如结果提示但是没问题于是对参数再进行一次但对方有时候接受的参数解析出错于是有了如下处理传递时也改成安全

最近接一个项目,需要调用对方接口生成 token 但只提供了 node 版,源代码如下

//https://blog.zhengxianjun.com/2015/05/javascript-crypto-js/
npm install crypto-js
var CryptoJS = require("crypto-js")
calSignature = function (toSign, key) {
        var hash, hex, signed;
        hash = CryptoJS.HmacSHA1(toSign, key);
        hex = hash.toString(CryptoJS.enc.Hex);
        signed = base64.encodeBase64(hex);
        return signed;
    };

var hmacSHA1 = CryptoJS.HmacSHA1("Message", "Secret Passphrase").toString(CryptoJS.enc.Hex);
console.log(hmacSHA1) ;//e90f713295ea4cc06c92c9248696ffafc5d01faf 
也可以在线测试 https://blog.zhengxianjun.com/online-tool/hash/


var str = "123456";
CryptoJS.MD5(str);




var str = "123456";
var password = "password";
 
// Hmac 相关调用前都增加了 Hmac
CryptoJS.HmacMD5(str, password);
CryptoJS.HmacRIPEMD160(str, password);
CryptoJS.HmacSHA1(str, password);

但是我们的项目是基于 PHP 于是有了

$sign = base64_encode(hash_hmac("sha1", $sign, $key)); 

果然 PHP 是最好的语言,一句话搞定。

另外说到请求对方接口的问题,对方要求传递一个 json 参数过去,比如

$url = "xxxxx.com";
$data = ["limit" => ["start" => 0, "end" => 5]];
$res = curlGet($url."/api/?".json_encode($data);

结果提示 fail Malformed HTTP request line
但是 python get 没问题

res = requests.get(url, params=data, headers=headers)

于是对参数再进行一次 base64

$res =curlGet($url."/api/?".base64_encode(json_encode($data));

但对方有时候接受的参数 base64 解析出错

>>> s="eyJsaW1pdCI6eyJzdGFydCI6MCwiZW5kIjo1fSwidGFibGVfbmFtZSI6Im9ubGluZV91dl9hY
2NvdW50X2lkXzFob3VyX2FuYWx5c2lzX2RhdGEiLCJmaWx0ZXJfYXJncyI6eyJ2ZmlkIjoiMTQiLCJ0a
W1lc3RhbXBfMWhvdXIiOiIyMDE4LTAxLTA1IDIwOjA0OjI2In0sImJpel9kZXMwMSI6MCwib3JkZXJfY
nkiOiJ0aW1lc3RhbXBfMWhvdXIifQ"
>>> base64.b64decode(s)
Traceback (most recent call last):
  File "", line 1, in 
  File "d:python27libase64.py", line 76, in b64decode
    raise TypeError(msg)
TypeError: Incorrect padding
>>> base64.b64decode(s+"===")
"{"limit":{"start":0,"end":5}"
于是有了如下处理
def decode_base64(data):
    missing_padding = len(data) % 4
    if missing_padding != 0:
        data += b"="* (4 - missing_padding)
    return base64.decodestring(data)

传递时也改成 安全 base64

function urlsafe_b64encode($string) {
   $data = base64_encode($string);
   $data = str_replace(array("+","/","="),array("-","_",""),$data);
   return $data;
 }
function urlsafe_b64decode($string) {
   $data = str_replace(array("-","_"),array("+","/"),$string);
   $mod4 = strlen($data) % 4;
   if ($mod4) {
       $data .= substr("====", $mod4);
   }
   return base64_decode($data);
 }

$res =curlGet($url."/api/?".urlsafe_b64encode(json_encode($data));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28137.html

相关文章

  • PHP对接1688跨境铺货功能sdk使用说明

    摘要:文件说明文件夹各接口封装类各接口回调控制器路由文件调用方法实例化时需要传入参数参数就是将要调用接口的名称参数列表跨境场景获取商品详情跨境场景获取商品列表跨境场景下将商品加入铺货列表同步铺货结果批量添加子账 文件说明 /app/Component/Ali/Sdk -- sdk文件夹 /app/Component/Ali/AliApi.php -- 1688各接口封装类 /app/Com...

    Hegel_Gu 评论0 收藏0
  • 自建网站对接微信公众号

    摘要:自建网站对接微信公众号微信公众号技术平常我们有些写各种网站个人博客系统物流管理系统通信录管理系统校园二手网站我们都知道只需要租用一个服务器再配置一个备案好的域名就可以在浏览器上进行访问了不知大家不知大家有没有想过将你搭的网站对接微信公众 title: 自建网站对接微信公众号date: 2018-04-12 15:25tags: 微信公众号, PHP codeigniter cat...

    mylxsw 评论0 收藏0
  • 手把手教你小程序对接微信支付

    摘要:按着我的步骤一步一步操作,你就可以成功的到这个微信支付技能包。原文链接手把手教你实现小程序微信支付由于自己本身就是开发的,所以只涉及到微信支付的开发。我将会一步一步的记录如何实现微信支付的。第一步先上微信支付开发文档境内普通商户里面下载与。 这是我自己研究了两天的微信支付整理得的开发笔记,然后在这里分享给大家,让大家快速上手微信支付。 按着我的步骤一步一步操作,你就可以成功的get到这...

    XBaron 评论0 收藏0
  • PHP DES-ECB加密对接Java解密

    摘要:最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个的,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的工程师对接出来的,在这里记录一下大致的流程。 最近公司有个业务,需要对接第三方接口,但是参数是需要加密的,对方也只提供了一个java的demo,在网上到处搜索,没有找到直接就能用的方法,后来还是跟公司的Android工程师对接出来的,在这里记录一下...

    jsliang 评论0 收藏0

发表评论

0条评论

kel

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<