iOS-apps中用于登录系统的标准程序是什么?

时间:2014-01-14 00:22:00

标签: ios objective-c security authentication encryption

我正在创建一个应用程序和一个我已经开始的项目的网站,但我不确定我应该怎么做才能登录。这不是“我是菜鸟,我想要一个登录的应用程序” -question。我对网络,数据库和应用程序开发都有一定的经验,但除了应用程序模板之外,我从未真正触及 security 的主题。

我想象的是一个像Skype,Facebook,NetFlix这样的“简单”登录系统,真的是你能登录的任何应用程序,它还有一个登录的网站。

我的一部分问题是关于流程的安全性。我最初的想法是,绝不应该通过互联网发送干净文本的密码,这使我相信在登录时,密码应该在手机上以及网站上进行散列/加密。我做了一些小事 - 时间哈希/加密之前,只需使用sha1md5来“转换”文本。这样做的正确方法是什么?根据我目前的知识,我假设如果我使用md5加密密码,任何人都可以使用md5解密它,但我可以使用SALT(?)或一些改变关键的形式。这就是“大男孩”是怎么做的,还是有一个我不知道的秘密通道?

现在进入真正的问题 ..我应该如何安全地存储登录信息?

我尝试过:在Xcode中为此做一个“测试项目”时,我只创建了一个User类,其中包含username字段。通过输入用户名和密码“登录”时,我只是将POST - 方法HTTP-request发送到我的.php页面,该页面只执行SELECT * FROM User WHERE Username = '$_POST['username']' AND Password = '$_POST['password']';如果数据库返回一行,然后密码是正确的,页面可以用JSON或其他方式打印出用户。当设备成功登录后,我在应用程序中转换了用户对象,现在包含用户名(可能包含用户ID,电子邮件,地址等)到NSData*,并使用NSKeyedArchiverNSKeyedUnarchiver保存并加载用户,永远不再进行身份验证。如果用户单击“注销”,我会擦除此“存档”。这有效,但我觉得这不是一种特别的安全方式。如果是这样,那为什么呢?

(我们的后端目前是谷歌的App Engine(java),它支持OAuth。有些人建议这样做,但我们找不到任何适合我们自定义用户计划的文档)

3 个答案:

答案 0 :(得分:2)

密码传输

确保这一点的简单方法是通过SSL发送密码。如果您设置SSL证书并通过https执行所有身份验证,则传输层将对所有来回通信进行加密。注意 - md5不是加密算法,它是一种弱哈希算法 - 不要将其用于安全性。

存储登录

您的密码应作为盐渍哈希(随机盐,具有抗冲突哈希函数,如SHA256)存储在数据库中。不要在任何地方存储密码的纯文本版本。如果您在服务器端使用PHP,则可以使用新的password_hash()函数或crypt()来生成和比较您的盐渍哈希值。

如果您通过SSL进行安全通信,则应该只需使用网络服务器的会话功能来跟踪登录信息(例如$_SESSION['user_id'] = ...)。

答案 1 :(得分:0)

如果您想要安全地存储您的用户名/电子邮件/地址或其他任何内容,内置的keychain是Apple唯一可以开心的方式。

查看SSKeychain(或PDKeychainUICKeychain)并对其进行扩展,以包含您要存储的每个媒体资源。通常它用于存储用户名和密码组合,但可以扩展为存储任意数据安全

至于将安全数据传递到服务器,请通过HTTPS执行。

如果您愿意,我可以提供示例。

答案 2 :(得分:0)

另一种选择是添加某种OAuth或XAuth登录过程。

这样,您不会存储任何密码,只会存储所谓的“令牌”。令牌过期,可以撤销。

根本不存储用户名和密码是保护用户名和密码的最佳方式。

亚历