Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在将分发给客户端的应用程序中保护API密钥_Python_Api_Api Key - Fatal编程技术网

Python 如何在将分发给客户端的应用程序中保护API密钥

Python 如何在将分发给客户端的应用程序中保护API密钥,python,api,api-key,Python,Api,Api Key,我正在构建一个使用双腿身份验证的应用程序。我得到了API密钥和API秘密,但现在我感到困惑 我目前正在将我的api密钥和机密存储在.yml文件中。但我想分发.app代码,它最终将拥有.yml文件 但是.app文件将包含.yml文件,这是不好的,因为每个人都可以看到API密钥和密码 如何存储API密钥和密码,以便我的应用程序可以在用户看不到的情况下访问密钥和密码?答案取决于几个变量: 包括你的消息来源吗 可以使用服务器为您调用API吗?如果是这样,您是否也可以对服务器发出的呼叫应用限制 将编译代码

我正在构建一个使用双腿身份验证的应用程序。我得到了API密钥和API秘密,但现在我感到困惑

我目前正在将我的api密钥和机密存储在
.yml
文件中。但我想分发.app代码,它最终将拥有.yml文件

但是.app文件将包含.yml文件,这是不好的,因为每个人都可以看到API密钥和密码


如何存储API密钥和密码,以便我的应用程序可以在用户看不到的情况下访问密钥和密码?

答案取决于几个变量:

  • 包括你的消息来源吗
  • 可以使用服务器为您调用API吗?如果是这样,您是否也可以对服务器发出的呼叫应用限制
  • 将编译代码用于存储密钥的位置是一个选项吗?如果是这样的话,是否有可能混淆它
  • 以下是我根据经验对不同场景的建议:

    不包括源代码,使用服务器是一个选项,可以应用限制,但是使用编译代码不是一个参数 然后使用服务器发出请求。假设您需要调用
    example.com/api/v1
    ,并且您希望使用一组特定的参数调用一个特定的函数,那么您只能允许对该特定api、该特定的参数集和该特定函数的请求。这样,它对潜在的攻击者来说毫无意义,因为它只调用一个函数而不调用其他函数

    源代码不包括在内,使用服务器不是选项,编译代码也不是选项 嗯,你没什么办法,模糊处理是你最好的办法。这样做的最佳方法是将其隐藏在代码深处,并使其变得模糊,等等

    源代码包括在内,使用服务器不是一个选项,但您可以使用编译后的代码 使用真正模糊的程序集,如果可以,请不要共享该程序集的源代码。例如,您可以使用“红鲱鱼”指令,就像以前一样,您应该将其隐藏在代码的深处

    源代码不包括在内,使用服务器不是一个选项,但您可以使用编译后的代码 对于这一点,它与上面相同,因为不包括程序集的源代码


    <强>如果我没有在这里列出您的场景,请自由地评论,我将编辑我的回答<强> < /p> 虽然我认为现有的答案在技术上是正确的,但可能会指出分布式软件中的硬编码API密钥存在一些安全问题。 API密钥的性质是不稳定的,它不是设计为永久的

    如果API密钥无效,会发生什么情况?这难道不会让所有分布式软件都变得无用吗? 如果API密钥具有写入权限并且被泄露,会发生什么情况?您如何区分合法和恶意写入

    尽管我了解开销,但最终用户可以设置由最终用户自己获得的专用密钥的场景,以及替换初始密钥的方法将有助于解决上述两个问题


    API的关键功能之一是由代表用户的机器使用,但如果所有用户都相同,则此功能将变得毫无意义。

    相关:这里的答案似乎集中在已编译的应用程序上。是的,有些可以应用于Ruby或Python脚本。例如,我可以设置一个单独的服务器来保存密钥并通过它路由请求;但是,对于一个200行的脚本来说,这似乎有点过分了,否则它就不会有任何外部基础设施。因此,(1)包含源代码,(2)使用服务器不是一个实用的选择(程序不够大/复杂,(3)使用编译代码也不实用(它将比脚本本身更复杂)。嗯,很遗憾,在这方面帮不了你。Castels的答案是对的