如何在移动应用程序中安全地存储密码

Posted

技术标签:

【中文标题】如何在移动应用程序中安全地存储密码【英文标题】:How to securely store a password in a mobile application 【发布时间】:2018-07-31 00:26:33 【问题描述】:

我最后几天都在阅读文章和 OWASP,这就是我想要的设计。我的应用程序会将数据保存在云中。密码不是一个微不足道的 PIN,所以每次输入它都会很尴尬。该应用程序经常使用,所以我想保存密码。

我的建议如下。请写下你的反对意见:

    用户输入凭据 REST 服务对用户进行身份验证并提供某种有效期为数小时的令牌 REST 服务提供与此用户关联的公钥 移动应用程序使用此公钥加密密码 如果令牌过期,应用会将用户名和加密密码发送到 REST 服务 REST 服务查找私钥并验证解密的密码 REST 服务返回当前令牌

备份 REST 服务将使用令牌对用户进行身份验证。它可能会返回令牌过期错误。

我敢打赌,这种方法对于非银行应用程序来说是安全的。我错过了一些空洞吗?攻击者甚至可以拥有 root 访问权限、反编译混淆的应用程序、修改二进制文件,但他无法在移动设备上获取密码。即使您喜欢该提案,也请发表评论,以便我也得到积极的反馈。

资源:

https://www.owasp.org/index.php/Mobile_Top_10_2016-Top_10 https://www.androidauthority.com/use-android-keystore-store-passwords-sensitive-information-623779/ https://www.androidauthority.com/where-is-the-best-place-to-store-a-password-in-your-android-app-597197/

【问题讨论】:

您使用了“加密”一词,这听起来像是您的计划 - 加密/解密密码?密码应始终经过哈希处理(未加密)且永远不可解密。我会说你的计划几乎是好的,但应该使用散列代替。客户端可以在本地散列和存储密码,然后将该散列发送到服务器端进行第二轮散列。服务器端哈希也应该使用盐。使用 PBKDF2 进行服务器端哈希 我需要在我的 REST API 中使用另一个组件 (IDM),我需要向它发送真实密码。我同意散列会是更好的方法。我将讨论直接集成 IDM 的可能性。 【参考方案1】:

我会避免将用户凭据存储在设备上,即使它们已加密。它引入了一些安全风险以及一些您必须考虑的业务逻辑,特别是当用户更改密码时您会怎么做?在您描述的方法中,应用程序将继续发送旧密码,使用用户公钥加密,并且身份验证将失败。

我建议使用 OpenID Connect 和 OAuth2。 OpenID Connect 将处理身份验证部分和授权的 OAuth2。 OAuth2 规范有一个刷新令牌的概念,可用于在访问令牌过期后对其进行更新。

另一个好处是您可以将身份验证委托给用户熟悉的服务,例如 Facebook、Google 等,这可以提供更好的用户体验。

这里有一些关于如何使用 OpenID Connect 和 OAuth2 与 Google 集成的信息:https://developers.google.com/identity/protocols/OpenIDConnect。 Facebook 等其他提供商也有类似的文档。如果您更愿意管理自己的身份,您甚至可以使用 IdentityServer,http://docs.identityserver.io/en/release/

【讨论】:

我不能使用我选择的授权。

以上是关于如何在移动应用程序中安全地存储密码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 应用程序中安全地存储凭据(密码)?

程序员必备基础:如何安全传输存储用户密码?

有没有办法将我的 MySQL 密码安全地存储在 Node.JS 中?

将 1 个密码安全地存储在数据库中

如何在移动应用程序中进行客户端加密时以安全的方式存储我的加密密钥?

PHP - 安全地存储外部服务的密码?