如何在iPhone应用中实现密码恢复?

3
我想在我正在开发的 iPhone 应用程序中添加简单的密码保护。我可能会使用 crypt() 将密码存储在我的数据库中,这个数据库是 CoreData / sqlite 格式的。
我认为我已经很好地理解了如何创建和存储密码,但是如果用户忘记了他们的密码,我想添加一个密码恢复功能。
这是我在 iOS 中遇到困难的部分。我希望一切都是本地的,所以我想不出一种使用链接重置密码的方法。
我曾考虑过通过电子邮件发送密码,但在 iOS 中,没有办法发送电子邮件而不让持有设备的人看到电子邮件的内容。
我唯一能想到的方法是拥有一两个“备份密码”,这基本上是用户选择问题的答案(或者甚至只是存储一个提醒问题和密码)。
这些都不是真正安全的方式,尽管我应用程序中受到保护的数据并不那么关键,所以我不是在寻找最强大的解决方案(只是一个不太难实现,对用户不太不便,对黑客不太难破解的解决方案)。
非常感谢您的建议。
谢谢, Ron

你把明文密码存储在哪里?为什么需要通过电子邮件发送? - robert
我强烈建议不要使用安全问题。这些已被证明不安全。此外,如果您正在尝试保护数据,请不要忘记加密它(当然要使用从用户密码派生的密钥),否则密码保护将没有效果。这可能会对恢复密码的能力产生一些问题。 - Artium
@Artium...感谢你的建议!对于我的应用程序来说,安全性并不是非常重要。它基本上是一个学习应用程序,不同的用户可以为彼此准备“测试”。我只想确保学生作弊不是“超级容易”的事情,所以我希望有一个非常基本的密码保护方案。如果学生真的想作弊,有很多方法可以做到...我只是想让它对他们更加困难一些。 - Ron
2个回答

5

与其恢复密码,您可以提示使用在他们初始创建帐户时设置的标准来重置密码--例如母亲的婚姓、最后四位等。这样,您就不需要担心解密密码或将其发送给用户。一旦他们正确回答了足够的安全问题,就会提示他们重置密码。您可以将此数据加密存储在本地。您永远不需要向用户发送密码。


Experian.com使用这个模型。 - George Johnston
谢谢回复!这似乎是一个合理的方法(尤其是因为我对安全没有那么多的担心)。 - Ron

1

最简单的方法可能是将“密码保护”设置为可选,并显示警告(“如果您忘记密码,您的数据可能无法恢复!”)。

这不会非常安全:除非您自己加密,否则数据很可能会以未加密的形式出现在手机备份中。结果是决心强烈的用户可以向您寻求帮助,您可以为他们编写一个工具,通过挖掘未加密的备份并重置密码来解决问题。

避免使用内置的crypt(),它可能基于DES并且仅限于8个ASCII字符。将明文密码存储在钥匙串中也不是太糟糕的选择。


谢谢你的建议!你建议避免使用crypt()的原因是什么?是因为出口限制还是其他原因(我认为crypt在使用时是安全的...特别是在加密密码而不是数据时)。我可能不会只存储纯文本,但我可以做一些简单的位操作而不是使用crypt()。 - Ron
我在回答中说:传统的基于DES的 crypt() 很不足,主要原因是它的输入仅限于8个ASCII字符和一个12位盐值。 OS X似乎没有改进的crypt()。 bcrypt是不错的选择(但使用提供的bcrypt_gen_salt函数;您可能需要调整它以调用SecRandomCopyBytes()等):http://codahale.com/how-to-safely-store-a-password/ - tc.
感谢您的澄清和提供链接。这是一篇有趣的阅读! - Ron
@tc。我们遇到了一些用户,他们已经被警告过,但仍然忘记了密码,提示对他们没有帮助,他们也无法记住问题的答案。因此,我的问题是,如何在快照中挖掘以恢复钥匙链中的凭据?我已经搜索了一些(不是详尽地),但没有找到有用的东西。 - stephen
@stephen 如果备份是加密的,你可以尝试使用https://code.google.com/p/iphone-dataprotection/。如果备份没有加密,则数据将使用设备特定密钥进行加密。如果用户无法访问设备,则无法解密数据。如果用户可以访问设备并且您是应用程序开发人员,则可以编写一个从钥匙串中读取密码的应用程序,但这与原始问题(大部分)*完全*无关。 - tc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接