android - Web 服务、Android 客户端、SSL

标签 android web-services ssl

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

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

在 Android 上,我是存储密码还是哈希值(私有(private)偏好)?

最佳答案

这是一个大问题。比简短回答范围内可以轻松解决的问题要大。我认为您提出这些问题是件好事,因为这表明您了解所涉及的风险。

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

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

在任何情况下,散列应该在您存储散列的地方执行。也就是说,身份验证、散列和存储都应该是服务的责任,而不是客户端的责任。谨防任何类型的实现容易受到 replay attacks 的影响.

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

最后(我有一个 session 要参加 ;),如果你认为这一切可能“矫枉过正”,请记住 60 percent of users use the same password ,作为开发者,我们有责任维护好他们对我们技能的信任。

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

关于android - Web 服务、Android 客户端、SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19978579/

相关文章:

java - 在 Axis Web 服务中使用 Java 中的复杂数据类型

C# Elastic Beanstalk webapp,找不到与具有 webhttp 绑定(bind)的端点的方案 https 相匹配的基地址。

c# - 使用 Xamarin Forms 播放视频

android - 丢失包裹

android - Android 版 Volley 的 JSONArray 响应

java - clientApplicationContext xml 文件出现问题

c# - 由于应用程序/dime (.Net) 的内容类型导致使用 Web 服务时出错

php - PHP Twitter API 中的“无法获取本地颁发者证书”

windows - 如何在Windows服务上添加证书

android - 如何在使用 Rx 开始第二个请求之前等待第一个请求完成?