代码之家  ›  专栏  ›  技术社区  ›  Houman

如何安全地将密码发送到REST服务?

  •  10
  • Houman  · 技术社区  · 11 年前

    我正在使用 Flask-Restful 以构建REST服务。然后,iOS设备将连接到此REST后端以同步本地数据。

    该服务将通过 https协议 联系

    REST服务是无状态的,用户必须在每次请求时进行身份验证。因此,用户名和密码将以清晰的格式发送到REST服务。后端将对密码进行散列,并对照数据库中现有的散列密码进行检查。

    api.add_resource(Records, '/rest/records/<string:email>/<string:password>/<string:ios_sync_timestamp>')
    

    现在,我看到这种方法的一个问题是,作为GET url的一部分,用户名和密码的格式是清晰的。服务器日志显然会跟踪这一点。现在,如果我的后端被黑客入侵,日志文件会泄露所有用户名和密码。

    对此最好的解决方案是什么?我想也许可以将用户名和密码作为POST参数发送,但我该如何处理GET请求呢?

    class Records(Resource):
        def get(self, email, password, ios_sync_timestamp):
            pass
        def post(self, email, password, ios_sync_timestamp):
            pass
    
    2 回复  |  直到 11 年前
        1
  •  4
  •   Sandro Munda    11 年前

    要使用所需的用户名和密码对每个请求进行身份验证,您应该使用: Basic Authentication .

    要使用它,它非常简单,并且可以与所有HTTP方法(GET、POST…)配合使用。您只需要在请求中添加一个HTTP头:

    Authorization: Basic <...>
    

    这个 <...> 部分是 username:password 以base64编码。

    例如,如果您的登录名为 foo 您的密码是 bar 。HTTP标头应具有以下行:

    `Authorization: Basic Zm9vOmJhcg==`
    

    通过您的 HTTPS协议 连接,它是安全的。

    编辑:使用烧瓶,您可以使用 Flask HTTP auth 实现这一“自动”。

        2
  •  2
  •   Paolo Casciello    11 年前

    另一种解决方案是生成一个 API Key 使用 POST 首先检查凭据请求,然后将其传递到请求标头中。然后,您可以在每个API处理程序中使用 @before_request 处理程序。

    工作流程

    • 客户端发送 岗位 使用凭据(用户名/通行证)连接到服务器
    • 服务器使用API密钥进行回复。就像某种秘密的六进制摘要。

    从现在开始

    • 每次客户端需要发送API请求时,它都会添加一个标头(让我们称之为 X-API-Key 使用API密钥。