api参数加密验证方式

1 排序

  • 过程:参数按照key的字典排序,以升/降序调整参数顺序。
  • 场景:将请求参数拼接后,生成签名,避免在传输过程中遭到修改。
  • 效果:统一客户端、服务端签名过程,使得能够对比签名有效性。
<?php
$p = [
    'b' => "1",
    'c' => '2',
    'a' => '3'
];
$k = array_keys($p);
array_multisort($k, SORT_STRING, $p);
var_export($p);

// 拼接
$str = "";
foreach ($p as $key => $value) {    
    $str .= $key . '=' . $value . '|';
}
$str = rtrim($str, '|');

// 签名
$str = signature($str);

2 定长随机字符串

  • 过程:在待发送数据中的特定位置,插入定长的随机字符串。
  • 场景:在加密时,在原始数据首部插入16个字节的随机字符串,增加破译难度。
  • 效果:攻击者即便获取加密密匙,也无法知道数据的切割位置。
<?php
$s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
// 自定义长度
$randStr = substr(str_shuffle($s), 0, 16);
var_export($randStr);

$data = "your data";
$data .= $randStr;

$encry = openssl_encrypt($data, "AES-128-ECB", "1234567890123456", OPENSSL_ZERO_PADDING);

3 补位

  • 过程:确定填充最大值max,生成字符与填充字节数的对应关系(如:ASCII);计算原始数据字节数len,取余m = len % max,m为0时取m=max;得到填充字符s=chr(m),数据尾部填充m个s。
  • 场景:在加密时,在原始数据尾部随机填充若干个字符,增加破译难度。
  • 效果:自定义填充个数与字符的映射,攻击者无法知道数据的切割位置。
<?php
$block = 32;

$data = "your data";
$len = strlen($data);

$s = $len % $block;
$s = $s ?: $block;
// 不超过255,可以使用ASCII集
// 数据末尾始终会有填充字符串
// 解密时,用ord($lastStr) 获取填充字符串长度
$c = chr($s);

$data .= str_repeat($c, $s);

$encry = openssl_encrypt($data, "AES-128-ECB", "1234567890123456", OPENSSL_ZERO_PADDING);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值