我是API开发的新手,但是已经成功设法通过阅读我能找到的所有文章来实现Phil Sturgeon和Chris Kacerguis的CI REST服务器,但是从下面的问题:
CodeIgniter REST API Library Ajax PUT throwing 403 Forbidden和
How can I generate an API Key in My own Controller in Codeigniter,我得到了一个答案.
我已按照第一个问题的接受答案中的建议将“boguskey”添加到数据库中,但我对此处的安全性感到困惑.如果我需要一个硬编码的API密钥来生成新密钥,并且有人可以查看标头以查看这个伪造的API密钥,那么如何从那些使用此API密钥生成大量API密钥的人那里保护我的API在我的API中为我们?如果我不添加boguskey,那么无论我调用哪个函数,都会得到“无效的API密钥”.
如果这是一个愚蠢的问题,我很抱歉,但如果有人有一个如何安全地生成密钥的例子(或者至少告诉我,如果我误解了这种情况),我将非常感激.
最佳答案 为了确保最大的安全性,你应该加密所有发送的数据,然后如果API可以正确解密你应该没问题,你可以使用RSA加密,所以如果任何人拦截请求他不能解密或克隆它,但RSA不是旨在用于长文本块,因此您可以使用混合加密.即,这涉及使用RSA对对称密钥进行非对称加密.
随机生成对称加密(例如AES)密钥并使用它加密纯文本消息.然后,用RSA加密对称密钥.传输对称加密的文本以及非对称加密的对称密钥.
然后,API可以解密RSA块,这将产生对称密钥,允许对称加密的文本被解密.
要在CodeIgniter上实现RSA,可以使用this类,在控制器上调用文件require_once(“RSA.php”);.
在API使用者控制器上创建一个包含数据和非对称加密对称密钥的数组
$request_data = array();
$request_data["username"] = "taghouti";
$request_data["project"] = "Secured_API";
$serialized_request_data = serialize($request_data);
$enc = new RSAEnc($serialized_request_data,'public_key');
$encrypted = $enc->result();
$request_data = array(
"data" => base64_encode($encrypted->result),
"key" => base64_encode($encrypted->key)
);
在API控制器上,您应该尝试使用私钥解密对称密钥,如果解密成功,您应该没问题
if ($_POST["key"]) {
$key = base64_decode($_POST["key"]);
$_POST["key"] = null;
if (isset($_POST["data"])) {
$data = base64_decode($_POST["data"]);
$dec = new RSADec($data, 'private_key', $key);
$decrypted = $dec->result();
if($decrypted->success !== true) die("Decryption failed");
$decrypted = @unserialize($decrypted->result);
$_POST = is_array($decrypted) ? $decrypted : array();
$this->_post_args = $_POST;
}
}
if($this->input->post('project') && $this->input->post('username')) {
//Enjoy
} else {
die('data parsing error');
}