Web服务,Android客户端,SSL

时间:2013-11-14 13:13:37

标签: android web-services ssl

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

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

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

1 个答案:

答案 0 :(得分:0)

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

我可以试着给你一些指示,至少。首先,md5和sha1不是用于保护用户凭据的适当算法,哈希和盐化哈希的过程本身就是一个章节。查看Secure Salted Password Hashing - Doing it Right以及Our password hashing has no clothes的某些背景信息。并查看bcrypt或PBKDF2作为更适合的散列算法。

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

在任何情况下,都应在存储哈希值的位置执行散列。也就是说,身份验证,散列和存储都应该由服务负责,而不是客户端。请注意易受replay attacks攻击的任何类型的实施。

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

最后(我要参加一个会议;),如果你认为这一切都可能“过度杀伤”,那就记住60 percent of users use the same password,并且作为开发人员,我们有责任妥善保管信任他们投资于我们的技能。

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