【问题标题】:CI REST Server API keysCI REST 服务器 API 密钥
【发布时间】:2014-07-21 18:08:34
【问题描述】:

我是 API 开发的新手,但通过阅读我能找到的所有文章,我成功地实现了 Phil Sturgeon 和 Chris Kacerguis 的 CI REST Server,但我无法回答以下问题:@987654321 @ 和How can I generate an API Key in My own Controller in Codeigniter

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

如果这是一个愚蠢的问题,我深表歉意,但如果有人能举例说明我如何安全地生成密钥(或者如果我误解了情况,至少告诉我),我将不胜感激。

【问题讨论】:

  • 这里有人知道吗?我所做的任何研究都没有向我展示我可以使用的东西。我真的希望在这里得到一些反馈。提前致谢!
  • 你的假密钥是否有足够的权限来使用你的 api 的 http 路径?密钥的“级别”需要至少或更高的权限才能使用结束路径。 GETS 可能有一个低级别,1,其中 PUTS、POSTS 和 DELETES 将具有不同的密钥,具有更高级别的访问权限,可能是 10。
  • 嗨@Withremote。权限不是这里的问题。问题是伪造的密钥在标题中清晰可见,所以我害怕人们会滥用我的 API 来创建新帐户。但我仍然没有答案 - 除了可能使用非常低的限制。
  • @KobusMyburgh 你解决问题了吗?如果是,如何?我面临同样的问题。我正在进行 ajax 调用以生成密钥,但要执行该操作,我需要传递管理员密钥,然后所有人都可以看到该密钥。如何安全地创建或暂停密钥?
  • @HardiksinhGohil 很遗憾没有,抱歉。我不得不制定另一个计划。

标签: php api codeigniter rest


【解决方案1】:

为了确保最大的安全性,你应该加密所有发送的数据,然后如果 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');
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2012-12-16
    • 2014-03-04
    相关资源
    最近更新 更多