我正在编写一个 Android 应用程序,它通过 POST 请求连接到我的服务器。到目前为止,我正在使用 SHA-256 对纪元时间进行哈希处理和加盐,并将其用作用户名和密码旁边的第三个参数,以确保从应用程序完成身份验证。但是,攻击者可以反编译 apk 并找出我添加到纪元时间的盐,从而允许他们从任何地方发出 POST 请求。
我想知道是否有办法确保从我的应用发出 POST 请求。请注意,我无法从 POST 更改服务器的身份验证方法。
提前致谢。
最佳答案
HTTP 客户端身份验证是一个开放过程,允许供应商实现不同的身份验证方案。
除了 SSL(在 HTTP 协议(protocol)下运行时)具有自己的身份验证机制(用于服务器和/或客户端)之外,HTTP 协议(protocol)上的身份验证任务由 HTTP 中的 WWW-Authenticate
header 管理 header 协议(protocol)。该字段反射(reflect)了服务器是否需要某种身份验证以及对等方将如何进行身份验证。
这允许对等协议(protocol)身份验证(不仅可以对客户端进行身份验证,还可以对服务器进行身份验证)但它使 HTTP 方法不可知,因为身份验证过程与用于请求信息的方法正交。您可以对任何(或所有)http 方法(GET、POST、CONNECT、HEAD、PUT、DELETE 等)使用身份验证
您需要阅读 RFC 文档:7230 , 7231 , 7232 , 7233 , 7234和 7235 .
你比较感兴趣的是7234 (它描述了协议(protocol)身份验证)、和您请求的 Web 服务器的文档,以及服务的配置方式,以了解它支持的身份验证方法或您必须提供的凭据对客户端进行身份验证。
一般情况下,流程如下:
- 客户端对目标 url 发出未经身份验证的信息请求。
- 服务器拒绝请求,必须使用信令认证,并提出认证方法和质询。
- 客户端重做请求,但从服务器提供请求的凭据。
- 服务器接受请求或再次拒绝。
要注意的是,根据使用的身份验证方法(例如 BASIC 是一个简单的用户名/密码方案,而 DIGEST 强制用户根据使用的凭据和一些服务器提供的信息生成摘要)您可能需要更多而不是到服务器的一次往返(服务器可以强制你,虽然不常见,但在链中使用其中两个来授予你对资源的访问权限)
对于 Java,可能一个很好的文档来源是 Apache HttpClient 类,它有一些来自 Apache 的教程,向您展示如何发出经过身份验证的请求。一个很好的引用是 this .
关于java - 如何确保通过 POST 请求从我的应用程序对用户进行身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52164853/