在两个python应用程序之间安全地传递凭据

时间:2017-04-04 11:27:07

标签: python json encryption flask

我正在寻找以下方案的一些建议。我需要构建的解决方案包含:

  1. 用python编写的客户端组件,它使用请求模块与2中描述的代理组件进行通信。客户端将json数据发送到代理组件,我们需要发送的内容之一是将在代理之间使用的凭据和最终的服务器。

  2. “代理”组件,它是基于python / Flask的应用程序

    • 使用https
    • 公开API样式访问以从第1点描述的客户端接收JSON数据
    • 通过使用请求模块和requests_ntlm auth对服务器进行身份验证,与步骤3中解释的最终服务器进行对话。
  3. 服务器是一个受信任但独立的服务器,不受我控制,运行apache或IIS。

  4. 目标是让我的客户端通过我的proxy flask / python app与第三方服务器通信。服务器期望客户端执行ntlm身份验证,这就是代理烧瓶应用程序使用requests_ntlm模块与服务器通信的原因。

    但是,代理不存储客户端的凭据(我不需要那样)。理想情况下,客户端将在应用程序启动时提供凭据,将这些凭据以JSON格式发送给代理,代理将使用它来获取服务器的响应,之后应该销毁凭据。

    我想知道在客户端和代理之间交换凭据的哪种方法最适合用来最大限度地提高安全性并保护尽可能多的保护?

    到目前为止,我得到的方法是:

    1. 客户端配置了“API密钥”,例如长度为192个字符。
    2. 当客户端与代理进行通信时,会以这种方式生成json请求:

      { "instruction": "Do this on server", 
        "username": "johndoe", 
        "password": "password in clear text obtained with getpass for example"
        "padding": "random string e.g. 128 - 1024 chars to make sure json payload is
                 always different no matter if all other fields are the same"
      }
      

      整个json请求使用API​​ KEY加密(打开以获取有关使用静态密钥对数据进行对称加密的推荐方法的建议)。 填充用于确保json在加密时始终不同。它是代理期望的垃圾数据,但会忽略,因为它不包含任何内容“

    3. 客户端发送的用户/传递永远不会存储在任何地方。当用户启动客户端python app时,getpass模块用于获取密码,将其放入json,加密并通过https发送,客户端应用程序可以删除与getpass一起使用的变量来读取密码输入。

      1. 代理使用https运行烧瓶。客户端信任代理的公钥。代理还可以使用地址过滤器来限制谁可以在客户端的方向上与其通信 - >代理(例如,只是可信子网)

      2. 代理期望json格式正确,包括使用垃圾填充来确保有效负载的随机性,因此它总是以不同的方式加密。代理将获得指令+用户/通行证

      3. 代理使用user / pass打开与服务器的连接,使用客户端提供的凭据通过requests_ntlm进行身份验证,并向服务器发送指令(例如,让我xyz.php?id = 123)

        < / LI>
      4. 服务器的结果作为json响应从代理返回到客户端,使用相同的api密钥加密json响应+填充以随机化数据。 Proxy还会删除用于存储最初在步骤2中从客户端收到的用户/通行证的变量。

      5. 客户端可以通过使用存储在配置文件或系统变量中的api密钥对其进行解密来读取响应。

      6. 您如何看待这种方法,以及在此设置中可以提高安全性的领域是什么?

        非常感谢您提出的任何建议以及您阅读这篇长篇文章的时间。

        微米。

0 个答案:

没有答案