首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Android客户端和服务器端应用程序之间安全地发送密码?

问如何在Android客户端和服务器端应用程序之间安全地发送密码?
EN

Stack Overflow用户
提问于 2019-01-01 17:59:08
回答 4查看 2K关注 0票数 4

我目前的Android应用程序要求用户使用用户名和密码登录。

Android应用程序调用REST web服务进行用户登录,我不想以明文形式传输密码。

如何保护我的用户密码,以便服务器端可以识别/验证每个用户?

我目前正在尝试使用Jasypt库,如下所示:

代码语言:javascript
复制
ConfigurablePasswordEncryptor passwordEncryptor = new ConfigurablePasswordEncryptor();
passwordEncryptor.setAlgorithm("SHA-1");
passwordEncryptor.setPlainDigest(true);
String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
...
if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
  // correct!
} else {
  // bad login!
}

但是,我的服务器端是用.NET编写的,就我对Jasypt文档的理解而言,密码加密器使用的是随机盐。

如何让我的服务器端代码与我发送的散列用户密码相匹配?

我所有的see服务都有HTTPS端点,这能保证在交换访问令牌时没有人能“看到”我的用户的密码吗?

EN

回答 4

Stack Overflow用户

发布于 2019-01-01 18:07:37

如果您使用Https(TLS),则拦截网络的任何人都无法访问您的密码。

您应该在服务器端代码中而不是在客户端中对密码字符串进行散列

您还可以使用OkHttp CertificatePinner将Https(TLS)证书绑定到您的连接,以避免中间人攻击。

票数 1
EN

Stack Overflow用户

发布于 2019-01-01 20:04:15

你必须小心你的所作所为。考虑实现常见的双因素密钥共享算法,例如。

客户端散列是一种非常不常见但却是非常好的实践。当然,这并不能阻止黑客登录到用户的帐户,但可以阻止他们获得可能被重用的纯文本密码。

我建议根据reset password公式更改电子邮件和密码,这样就需要电子邮件/短信确认。

最后,当您这样做时,非常重要的一点是,登录发生的连接是安全的,例如,https/tls。

票数 1
EN

Stack Overflow用户

发布于 2019-03-24 19:19:47

一个好的解决方案是避免使用传统的电子邮件/密码方法进行身份验证,而使用这里的另一个答案建议的OTP或一次性密码。

考虑一下用户体验:在移动设备上键入电子邮件和密码既麻烦又麻烦。那么他们也必须记住他们的密码?西方世界的普通人可能每天使用10到15个应用程序,而我们想要向他们的人类记忆库征税,以获得另一个密码,以便在拥挤的地铁上笨拙地输入他们的手机?

尽管放在一起有欺骗性的挑战,但考虑一下一次性密码。有了它,用户输入一个电话号码作为识别令牌。

理论上,每个用户都有自己独特的电话号码,这对用户来说很容易记住。因为你的用户是在他们的Android设备上,所以到目前为止是有意义的,对吧?也不需要笨拙地输入电子邮件和密码。

在他们输入电话号码后,我们将代码发送到移动设备,这是一个4到6位的数字。用户在应用程序中输入该代码,从而证明他们是电话号码所关联的设备的所有者。

与电子邮件/密码相比,动态口令的好处是它只需要很少的用户内存。是的,它甚至比OAuth更好,因为如果用户从未通过他们的移动浏览器登录过Gmail帐户或Github帐户怎么办?然后,他们又回到了移动设备的电子邮件/密码笨拙的身份验证方式。

一次性密码是用户友好的。

但是你说好,但它是否安全,更重要的问题是...我如何才能使我的服务器端代码与我发送的散列用户密码相匹配?

是的,因此一次性密码技术一直是一个雄心勃勃的项目,以承担国际海事组织。

因此,我们需要持久化用户应该输入到设备中的代码,这样我们就可以在将来的某个时候对其进行比较。当您生成代码时,将其保存到Firebase,以便将来某个时候您可以联系Firebase,假设电话号码为212-555-1212的用户刚刚向您发送了代码1234,这是正确的代码吗?

因此,Firebase使用OTP的方式是您可以将代码存储在Firebase中。然而,挑战实际上是向用户发送代码。这是一条实际的SMS消息。要解决这个问题,你不能单独使用Firebase,你可以集成非常流行的Twilio。Twilio完全是通过手机短信与用户交互的,所以我们可以利用Twilio向用户发送代码。

您还可以在Firebase中处理身份验证或用户系统。一旦用户进入OTP,我们就会通过Firebase生成JSON Web令牌。

所以所有的JSON存储和所有反映用户身份的信息,都可以保存在Firebase上。

但我还没有回答这个问题的另一部分:

如何保护我的用户密码,以便服务器端可以识别/验证每个用户?

好的,所以你需要比较一些服务器上的代码。它不能是Firebase,因为Firebase只是一个数据存储,它是一个存储JSON数据的地方,它不能让我们运行自定义代码。

那么,您是否编写了一个用于代码比较的服务器?我们不想在用户的设备上进行这种比较。

那么我们该怎么办呢?另外,我们如何生成代码?也不要使用用户的设备来做这件事。

那么我们在哪里生成代码呢?我们知道使用Firebase数据存储来存储代码,但是我们如何生成它呢?

对于Google Cloud Functions来说,这是一项不错的工作。

因此,Google Cloud Functions是在Google服务器上按需运行的代码片段。GCF与Firebase数据存储具有紧密的互操作性和集成。

我们可以在Firebase内部的数据中添加一些逻辑或处理。GCF将允许您使用一些自定义逻辑来生成代码并将其保存到Firebase,并且GCF还可以在用户发送代码后对其进行比较。

AWS Lambda和GCF在功能上几乎相同,因此这也可以作为一种选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53994540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档