zoukankan      html  css  js  c++  java
  • API接口认证&加密笔记

    API合作商Key 生成秘钥KEY
    秘钥是用来完成加密,解密的
    API合作商KEY(生成秘钥): DesKey
    对称加密:加解密是同一个密钥,速度快,数据接收方需要公布其私钥给数据传输方,安全性完全依赖于该密钥。如AES,3DES,DES等,适合做大量数据或数据文件的加解密。

    非对称加密:加密用公钥,解密用私钥。公钥和私钥是成对的(可借助工具生成,如openssl等),即用公钥加密的数据,一定能用其对应的私钥解密,能用私钥解密的数据,一定是其对应的公钥加密。对大量数据或数据文件加解密时,效率较低。如RSA,Rabin等,数据接收方需公布其公钥给数据传输方,私钥自己保留,安全性更高。

    API合作商签名(加密参数) : Md5Key
    参考: https://blog.csdn.net/hi_robert/article/details/74294495

    数字签名
    作用:保证信息传输的完整性、发送者的身份验证、防止交易中的抵赖发生。
    数字签名是为了做一个客户合法性和数据完整性的校验,防止流氓软件对数据传输进行拦截,对数据篡改后再传输。一般是通过hash函数计算出一个固定长度的哈希串(如md5,一般是根据授权的用户信息和选取数据体报文的摘要作为计算规则),加密后与数据体密文一起传输给接收方,接收方在对数据解密后,以相同的规则进行hash串的计算,如果两者一样,则证明该次请求是合法的。

    关键字: 接口验证 秘钥

    请求方,接口提供方

    1. 请求参数是否被篡改
    2. 请求来源是否合法
    3. 请求是否具有唯一性
      A. 参数签名方式

    参考: https://www.jianshu.com/p/d47da77b6419

    在编程中:一个幂等操作的特点是: 其任意多次执行所产生的影响均与一次执行的影响相同。

    AES 是一种对称加密算法
    plaintext 明文 , chipertext 密文

    接口认证签名、加密、解密

    请求参数的键按自然的顺序排序
    app_key 应用键 (唯一)
    app_secret 应用秘钥(唯一)

    1. _t 请求的时间,在一分钟之内合法,超过不合法
      客服端与服务端时间得统一,请求且响应的参数值也得

    用户登录凭证 token
    应用凭证: app_token
    code ===0 成功,其它失败
    msg
    data

    access_token 生成实例
    应用ID
    应用key
    providerid 1000000010
    privatekey 0B1FC078-A244-4FAD-BECC-6255DDDE5236
    四.接口参数key的生成规则
    1.接口参数key的生成规则如下:
    调用接口所需要的key定义为key=md5(“userid={1}&providerid={2}&privatekey={3}”)
    其中{1}为要查询或操作的id号,一般为接口的第一个参数,如接口UserLogin为用户编号userid, {2}为长宽分配给调用方的id, {3}为长宽分配给调用方的key,id及key值参见附录1.

    2.测试案例:
    key=md5(“010010000101&providerid=1000000010&privatekey=0B1FC078-A244-4FAD-BECC-6255DDDE5236”)
    key=“68ABC26E8C5FE2F7A18C511522C93AF9”
    还可以加随机字符串来加盐

    https://www.cnblogs.com/xiaochangwei/p/api.html
    无状态: 请求需要参数验证,响应也是需要参数验证的吧,得确定参数没有被修改
    对请求的合法性进行校验
    对请求的数据进行校验

    signature 签名,署名,信号
    timestamp 60s以内有效
    _t
    private_key 秘钥
    请求和响应都需要加一个签名参数

    微信jsAPI:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2

    设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。

    特别注意以下重要规则:

    ◆ 参数名ASCII码从小到大排序(字典序);
    ◆ 如果参数的值为空不参与签名;
    ◆ 参数名区分大小写;
    ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。
    ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段
    第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。

    腾讯云: https://cloud.tencent.com/document/api/213/6984

    SecretId:用于标识 API 调用者身份;
    SecretKey:用于加密签名字符串和服务器端验证签名字符串的密钥。

    HmacSHA1
    $secretKey = 'Gu5t9xGARNpq86cd98joQYCN3Cozk1qA';
    $srcStr = 'GETcvm.api.qcloud.com/v2/index.php?Action=DescribeInstances&InstanceIds.0=ins-09dx96dg&Nonce=11886&Region=ap-guangzhou&SecretId=AKIDz8krbsJ5yKBZQpn74WFkmLPx3gnPhESA&SignatureMethod=HmacSHA1&Timestamp=1465185768';
    $signStr = base64_encode(hash_hmac('sha1', $srcStr, $secretKey, true));
    echo $signStr;

    随机数,为了保证签名不可预测

    微信支付API接口协议中包含字段nonce_str,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。

    值为null,签名参数不参与签名计算

    参数值 ===null 不参与签名,为什么了?
    响应data参数也不参与签名

    共享钱包:
    MD5(agentName+API key + 随机字符串) 代理名称+私钥+随机字符串
    最好加上时间戳吧

    签名算法

    sha1withrsa sha256withrsa

    RSA2是在原来SHA1WithRSA签名算法的基础上,新增了支持SHA256WithRSA的签名算法
    RSA2 OPENSSL_ALGO_SHA256
    RSA OPENSSL_ALGO_SHA1

    https://blog.csdn.net/u014377963/article/details/71775171
    if("RSA2"==$this->sign_type){

    		openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA256 );
    	}else{
    
    		openssl_sign($data, $signature, $private_id, OPENSSL_ALGO_SHA1 );
    	}
  • 相关阅读:
    windows 2008 64位在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    uva 11552 dp
    A*搜索算法
    Dalvik虚拟机总结
    J2SE基础:5.面向对象的特性2
    Linux/Android——input_handler之evdev (四)【转】
    Linux/Android——input子系统核心 (三)【转】
    Linux/Android——输入子系统input_event传递 (二)【转】
    【Android】Android输入子系统【转】
    Linux/Android——usb触摸屏驱动
  • 原文地址:https://www.cnblogs.com/zqsb/p/11039008.html
Copyright © 2011-2022 走看看