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;
$c = chr($s);
$data .= str_repeat($c, $s);
$encry = openssl_encrypt($data, "AES-128-ECB", "1234567890123456", OPENSSL_ZERO_PADDING);