CI REST服务器API密钥


CI REST Server API keys

我是API开发的新手,但是通过阅读我能找到的所有文章,我成功地实现了Phil Sturgeon和Chris Kacerguis的CI REST服务器,但是有一个答案让我无法回答,从以下问题:CodeIgniter REST API库Ajax PUT抛出403禁止以及我如何在CodeIgniter自己的控制器中生成API密钥。

我已经按照第一个问题的公认答案的建议将"boguskey"添加到数据库中,但是我对这里的安全性感到困惑。如果我需要一个硬编码的API密钥来生成新密钥,并且有人可以查看头以查看这个伪造的API密钥,那么我如何保护我的API,然后有人使用这个API密钥在我的API中为我们生成大量的API密钥?如果我不添加boguskey,那么无论我调用哪个函数,我都会得到"无效API密钥"。

我的道歉,如果这是一个愚蠢的问题,但如果有人有一个例子,我如何能够安全地生成密钥(或至少通知我,如果我误解了情况),我将非常感激它。

为了确保最大的安全性,你应该加密所有发送的数据,然后如果API可以正确地解密它,你应该没事,你可以使用RSA加密,所以如果任何一个拦截请求他不能解密或克隆它,但RSA不是设计用于长块明文,所以你可以使用混合加密。也就是说,这涉及到使用RSA对对称密钥进行非对称加密。

随机生成一个对称加密(比如AES)密钥并用它加密纯文本消息。然后,使用RSA对对称密钥进行加密。传输对称加密的文本和非对称加密的对称密钥。

API随后可以解密RSA块,这将产生对称密钥,从而允许解密对称加密的文本。

要在CodeIgniter上实现RSA,你可以使用这个类,调用控制器上的文件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');
}