墨香年少 32 发布于 3月4日 设计安全的Web API加密签名方式通常涉及以下几个步骤: 选择加密算法:常见的有HMAC (Hash-based Message Authentication Code)、RSA、SHA-256等。HMAC是一种广泛使用的安全协议,因为它提供了一种验证消息完整性和身份验证的方式。 生成签名:使用服务器和客户端共享的密钥,对请求中的重要信息(如请求方法、URI、时间戳和请求体)进行加密,生成唯一的签名。 验证签名:服务器接收到请求后,使用相同的密钥和算法对请求进行加密,并将结果与请求中的签名进行比较。如果匹配,则认为请求是合法的。 以下是PHP和C++中实现API加密签名的示例。 PHP 示例 假设我们使用HMAC-SHA256算法生成和验证签名。 生成签名: <?php // 服务器和客户端共享的密钥 $secretKey = 'your_secret_key'; // 待签名的数据 $data = 'data_to_sign'; // 生成签名 $signature = hash_hmac('sha256', $data, $secretKey); echo "Signature: " . $signature; ?> 验证签名: <?php // 接收到的数据和签名 $receivedData = 'data_to_sign'; $receivedSignature = 'received_signature'; // 服务器端的密钥 $secretKey = 'your_secret_key'; // 使用相同的方法生成签名 $validSignature = hash_hmac('sha256', $receivedData, $secretKey); // 验证签名 if(hash_equals($validSignature, $receivedSignature)) { echo "Valid signature"; } else { echo "Invalid signature"; } ?> C++ 示例 在C++中,你可以使用OpenSSL库来实现HMAC加密。 首先,确保你已经安装了OpenSSL库。 生成签名: #include <openssl/hmac.h> #include <iostream> #include <iomanip> #include <sstream> std::string generateSignature(const std::string &data, const std::string &key) { unsigned char* digest; digest = HMAC(EVP_sha256(), key.c_str(), key.length(), (unsigned char*)data.c_str(), data.length(), NULL, NULL); std::stringstream ss; for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) { ss << std::hex << std::setw(2) << std::setfill('0') << (int)digest[i]; } return ss.str(); } int main() { std::string key = "your_secret_key"; std::string data = "data_to_sign"; std::string signature = generateSignature(data, key); std::cout << "Signature: " << signature << std::endl; } 验证签名与生成签名类似,你需要将接收到的签名与你自己生成的签名进行比较。 请注意,这里的C++示例需要链接OpenSSL库。如果你使用的是g++,可以通过添加-lcrypto选项来链接它,例如: g++ your_file.cpp -o your_program -lcrypto 这些示例展示了如何在PHP和C++中使用HMAC-SHA256算法来生成和验证API请求的签名。在实际应用中,你可能还需要考虑添加时间戳、随机数等额外信息到签名中,以进一步增强安全性。 目之所及,皆是回忆,心之所想,皆是过往 分享这篇帖子 链接帖子 分享到其他站点