php – CI REST服务器API密钥

我是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');
}
点赞