0

我正在使用该服务编写一个 Web 服务(Rest)和一个 Android 应用程序。没有登录,没有会话 - 而是在每次调用该服务时发送登录数据(用户名,密码)(通过org.apache.http.impl.client上的org.apache.http.client.methods.HttpPost。默认HttpClient)。为了确保通信安全,我将在我的网络服务器上“安装”一个简单的 SSL 证书(128 位)并通过“https”进行调用。这是正确的方法吗?通信(通过 POST 发送密码)会以这种方式得到保护吗?

服务器将为密码(md5,sha1)存储某种哈希值......Android应该发送密码并让网络服务生成哈希值还是应该发送哈希值?

在 Android 上,我是否存储密码或哈希(个人偏好)?

4

1 回答 1

0

这是一个很大的问题。比简短答案范围内可以轻松解决的问题更大。我认为你问这些问题是件好事,因为这表明你意识到所涉及的风险。

至少我可以试着给你一些指示。首先,md5 和 sha1 不是保护用户凭证的适当算法,散列和加盐的过程本身就是一个章节。查看Secure Salted Password Hashing - Doing it Right也许我们的密码散列在某些背景下没有衣服。并查看 bcrypt 或 PBKDF2 作为更适合的散列算法。

当谈到一般的架构时,我建议考虑在一次调用中对用户进行身份验证以获得某种身份验证令牌,然后将此令牌用于后续通信,而不是在每次调用时发送凭据。这不仅可以提高安全性,还可以提高性能,尤其是在故意使用耗时的加密哈希算法(如 bcrypt 或 PBKDF2)的情况下。另外,请记住,令牌应该与用户身份相关联,而不仅仅是一些“经过身份验证的会话”。这是您可能不应该自己实现的东西,而是依赖于您正在使用的框架中的某些机制。会话管理很棘手,例如提高 ASP.NET 会话安全性(<- 不是 ASP.NET 特定的)。

在任何情况下,都应该在您存储散列的地方执行散列。也就是说,身份验证、散列和存储都应该是服务的责任,而不是客户端的责任。当心任何容易受到重放攻击的实现。

SSL 一切都很好,而且(甚至是绝对必须的),但如果是我,我会考虑不仅保护传输层,而且还要确保调用者有权使用该服务,即使用证书。我不熟悉 Android 平台的内部工作原理,因此我无法就如何在这种情况下安全地执行此操作提出建议。

最后(我有一个会议要参加;),如果您认为这一切可能是“矫枉过正”,请记住60% 的用户使用相同的密码,作为开发人员,我们有责任照顾好信任他们投资于我们的技能。

祝你好运,继续寻求安全解决方案!

于 2013-11-14T13:51:23.373 回答