使用明文密码访问 REST API 的最佳实践

Best Practice for accessing REST API with plaintext password

我正在构建的应用程序使用 AJAX 连接到 REST Web 服务。此服务需要将纯文本用户名和密码作为 POST 数据与身份验证请求一起传输,而不是 API 密钥。除了这种糟糕的设计之外,user/pass 组合与用于访问与该服务关联的网站的凭据相同,这使得它们特别敏感。该服务确实使用 SSL,但 user/pass 仍以纯文本形式出现在 JavaScript 源中。由于最明显的答案 "don't use a service with such glaring security vulnerabilities" 对我来说不是一个选项,是否有任何巧妙的解决方案来保护用户名和密码?

此应用程序频繁请求 API 处理实时数据,因此我试图避免在我自己的服务器上使用代理,这基本上会使我的开销加倍。这让我希望有某种客户端解决方案。

我将部署缩小的代码,这会限制可读性,但这很容易逆转,并且不会混淆纯文本值,所以我希望有更健壮的东西。

我正在使用 jQuery,我的要求非常典型。

$.ajax({
    type: "POST",
    url: "https://my.insecurewebservice.com/api/",
    data: JSON.stringify({
        "username": "me@mymail.com",
        "password": "plaintextpassword"
    }),
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function(response, status, request) {
        // perform the usual work here
    }
});

无法在那种 API 模型中保护此类数据。在某些时候,浏览器中的 JS 将需要使用这些凭据进行 AJAX 调用,无论您在此之前做了什么(缩小、加密等),都必须在命令将密码传输到服务器。这是默默无闻的安全,它根本不是安全。

您的选择是:

  • 让提供商更改他们的 API
  • 在网络会话期间提示用户输入密码(听起来不是一个选项)
  • 通过您自己的中间网络服务代理这些请求

proxification 选项听起来是您最好的选择。这并不全是坏事,因为您也许可以在该层中进行一些缓存或其他优化。