我刚注意到这个article关于以纯文本格式存储用户信息的移动应用程序。我已经注意到在服务器上存储用户密码的想法(使用SHA-512哈希函数),但我不清楚在设备本身存储个人信息的最佳方法。
让我说清楚我基本上只谈论用户名和密码。我的应用程序与之交互的数据根本不敏感,我知道我可以对该数据实施某种对称加密/解密。
出于方便用户的目的,我想为用户提供一个在本地存储用户名和密码的选项,这样他们每次使用应用程序时都不需要输入用户名和密码。但我知道用户倾向于将重复使用相同的密码用于许多不同的目的,这意味着我需要采取预防措施来保护用户的密码安全。方便与安全之间的经典紧张。
在本地存储这些信息只是一个可怕的想法吗?或者是否有相对简单的方法来安全加密? iOS和Android O / S是否对此提供任何帮助?
不一定要寻找详尽的答案,但我真的很感谢一些研究课题,文章链接,书籍等等。非常感谢你。如果这是一个多余的问题,请指导我提供仍然被认为是最新的答案的任何帖子。
非常感谢!
答案 0 :(得分:2)
设备上的所有数据都会在某种程度上由设备自动加密,使用设备ID作为密钥。这样可以防止数据被设备本身或设备ID之外的任何人轻易读取。
您可以利用密码进行另一级加密,这种密码称为数据保护,它会阻止数据被读取,除非输入密码。
您可以使用NSFileManager访问文件并将NSFileProtectionKey
属性设置为NSFileProtectionComplete
,从而在应用中手动启用数据保护。请参阅:Implementing and Testing iOS data protection。
请注意,用户必须将其设备设置为需要密码,密码越强,数据就越安全。
即使您不将NSFileManager类与NSFileProtectionComplete
一起使用,也可以通过应用程序的配置文件轻松启用数据保护。请参阅:Data Protection / NSFileProtectionComplete - successfully supported through entitlements.plist?
我仍然不会存储密码。存储随机生成的会话密钥,这些密钥在登录时创建。至少可以使这些密钥过期,而不是纯文本密码。
答案 1 :(得分:0)
仅仅是对一年前这篇文章的跟进。我决定做的是生成一个随机会话密钥(类似于@Marcus Adams的建议)但是将该值用作盐。然后,我将该会话密钥与用户选择的明文密码连接起来,并将此值存储在设备上(如果用户选择存储其密码)。即,设备存储该值:
device_hash = sha256(device_salt || plaintext)
然后,哈希值成为我通过HTTP传递给服务器进行验证的字符串。在服务器端,我有一个不同的盐值存储在那里。当服务器收到设备哈希值时,它有自己的salt值,它与该字符串连接,然后执行自己的哈希值。最后一个哈希是存储在服务器数据库中的密码。即,服务器存储此字符串:
server_hash = sha256(server_salt || device_hash))
我认为这是安全性和便利性之间的可行平衡,特别是因为我只是试图保护密码,而不是试图加密在应用程序的正常过程中交换的实际数据。如果用户的设备遭到入侵,则攻击者无法使用彩虹表或类似的东西来对密码进行反向工程,因为密码已被腌制。如果某人真正有动力,SHA256以及密码的长度应该可以消除暴力攻击。
如果有人对此方法有任何批评,那就很好奇。