当前位置: 首页 > 知识库问答 >
问题:

CI REST服务器API密钥

东郭自强
2023-03-14

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

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

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

共有1个答案

苍嘉澍
2023-03-14

为了确保最大的安全性,你应该加密所有发送的数据,然后如果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');
}
 类似资料:
  • Java上是否有开源PGP密钥服务器实现?

  • 编辑:我需要通过有效载荷传递一些敏感信息。这可以是一个字母数字值。例如{“sender”:“+123”,“secret”:“encrypted_value”}客户端和服务器应该共享一个密钥,客户端可以使用该密钥对信息进行加密,服务器(lambda函数)应该对其进行解密。 任何建议都会很好!谢谢!

  • 当我需要App1的说明时,我的服务器用键1调用google api,当我需要App2的说明时,我的服务器用键2调用google api,当我需要App3的说明时,我的服务器用键3调用google api 所以我的服务器就像一个API网格一样工作。这违反谷歌条款吗?我担心他们会查看服务器的ip地址,看到有3个密钥使用,并假设我对相同的应用程序使用不同的密钥,这是被禁止的。

  • 我们正在使用城市飞艇向我们的Android应用程序发送推送消息。 在此过程中,我们需要使用Firebase控制台中提供的“服务器密钥”配置飞艇- 根据那里的建议,我们正在尝试从GCM迁移到FCM。 问题是“Firebase Cloud Messaging API(V1)”配置中缺少“服务器密钥”。它在“云消息传递API(遗留)”配置中仍然可用,但建议进行迁移。 遵循FCM配置中的链接对这个问题没有

  • 问题内容: 马克·墨菲(Mark Murphy)在他的博客上很好地说明了应将哪些信息排除在公共存储库之外。密钥材料(例如用于各种服务的OAuth密钥或API密钥)就是一个很好的例子。 有问题的应用程序将是移动android应用程序,因此有人对其进行反编译以获取秘密密钥不在此问题范围内。 如何配置公共CI实例(例如cloudbees)上的构建作业,以使机密不泄漏到构建日志或编译目录中?我的主要目的是

  • 我还没有REST API的经验,所以请原谅,如果我是混合术语。 现在,我正试图了解哪些是我的相关文档,我正在考虑两种选择: > 这里列出的方法-https://nl.mathworks.com/help/matlab/internet-file-access.html?s_tid=crux_lftnav都与RESTful Web服务有关。我还不知道客户机是否有一个可以归类为web服务的REST A