android - 如何在 Android 客户端和服务器端应用程序之间安全地发送密码?
问题描述
我当前的 Android 应用程序要求用户使用用户名和密码登录。
Android 应用程序调用 REST Web 服务进行用户登录,我不想以明文形式传输密码。
如何保护我的用户密码,以便服务器端可以识别/验证每个用户?
我目前正在尝试使用 Jasypt 库,如下所示:-
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 文档,密码加密器使用随机盐。
如何让我的服务器端代码与我发送的散列用户密码匹配?
我所有的网络服务都有 HTTPS 端点,这是否保证在交换访问令牌时没有人可以“看到”我的用户密码“在飞行中”?
解决方案
你必须小心你所做的事情。考虑实现一个常见的双因素密钥共享算法,例如TOTP。客户端散列
是一个非常罕见但非常好的做法。这当然不会阻止黑客登录用户的帐户,但会阻止他们获取可能重复使用的纯文本密码。我建议在重置密码公式
下更改电子邮件和密码,这样需要电子邮件/短信确认。最后,当您这样做时,登录发生的连接是安全的,例如 https/tls,这一点非常重要。
推荐阅读
- javascript - 在函数中更改对象中的值
- python - 基于相邻行单元格值合并行
- r - 比较两个文件头并确保它们具有相同的头,无论顺序如何
- c# - SocketException:连接被您的主机软件中止
- hyperledger-fabric - 跟踪谁使用数字签名做了什么
- python-3.x - ANTLR4 grammar testing methods
- html - 有条件地在 React 中设置所有 html 标签的样式
- c++ - 具有多个指针初始值设定项的 C++ for 循环
- c# - 如何使用 newtonsoft 序列化 JSchema 中的依赖项
- git - 致命:'.git/objects/pack/tmp_idx_XXXX' 上的 fsync 错误:权限被拒绝