共计 272 个字符,预计需要花费 1 分钟才能阅读完成。
算法思路
- 数据预处理:对传入的数据进行清理,去除空值和不必要的字段,同时对数据进行编码处理。
- 数据排序:按照键名的字典序对数据进行排序。
- 拼接数据:将排序好的数据键值对用特定的连接符拼接成一个字符串。
- 添加时间戳和随机数:在拼接好的字符串中加入当前时间戳和随机数,增加签名的唯一性和时效性。
- 使用 HMAC – SHA256:使用 HMAC – SHA256 算法对拼接后的字符串进行哈希计算,使用密钥作为 HMAC 的密钥。
- Base64 编码:对 HMAC – SHA256 的结果进行 Base64 编码,方便传输和存储。
代码示例
<?php /** * 生成签名 * * @param array $data 待签名的数据 * @param string $secretKey 密钥 * @return string 签名结果 */ function generateSign(array $data, string $secretKey): string { // 移除可能存在的 sign 字段 if (isset($data['sign'])) {unset($data['sign']); } // 数据预处理:去除空值和对值进行 URL 编码 $cleanedData = []; foreach ($data as $key => $value) {if ($value!== null && $value!== '') {$cleanedData[$key] = urlencode($value); } } // 按照键名进行字典序排序 ksort($cleanedData); // 拼接数据 $signStr = ''; foreach ($cleanedData as $key => $value) {$signStr.= $key. '='. $value. '&';} // 去掉最后一个多余的 & 符号 $signStr = rtrim($signStr, '&'); // 添加时间戳和随机数 $timestamp = time(); $nonce = bin2hex(random_bytes(16)); $signStr.= '×tamp='. $timestamp. '&nonce='. $nonce; // 使用 HMAC - SHA256 进行哈希计算 $hmac = hash_hmac('sha256', $signStr, $secretKey, true); // 对 HMAC 结果进行 Base64 编码 return base64_encode($hmac); } // 示例数据 $data = [ 'param1' => 'value1', 'param2' => 'value2', 'param3' => 'value3' ]; // 密钥,可根据实际情况修改 $secretKey = 'your_secret_key'; // 生成签名 $sign = generateSign($data, $secretKey); echo " 签名结果: ". $sign;代码解释
- 数据预处理:遍历数据数组,去除空值和 sign 字段,并对值进行 URL 编码,确保数据的一致性和安全性。
- 数据排序:使用 ksort 函数对清理后的数据数组按照键名进行字典序排序。
- 拼接数据:将排序好的数据键值对用 & 符号拼接成一个字符串。
- 添加时间戳和随机数:使用 time() 函数获取当前时间戳,使用 random_bytes() 函数生成一个 16 字节的随机数,并将它们添加到拼接好的字符串中。
- HMAC – SHA256 计算:使用 hash_hmac 函数对拼接后的字符串进行 HMAC – SHA256 哈希计算,使用密钥作为 HMAC 的密钥。
- Base64 编码:使用 base64_encode 函数对 HMAC – SHA256 的结果进行 Base64 编码,方便传输和存储。
安全性和适配性说明
- 安全性:该算法结合了数据清理、时间戳、随机数和 HMAC – SHA256 哈希算法,增加了签名的唯一性、时效性和安全性。
- 适配性:可以处理各种类型的数据数组,并且可以根据实际需求调整时间戳的有效期和随机数的长度。同时,Base64 编码的结果可以方便地在不同系统之间传输。
正文完