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



我正在为我即将进行的项目创建一个应用程序和网站,但我不确定我应该如何登录。这不是一个"我是一个傻瓜,我想要一个登录的应用程序">-问题。我在web、数据库和应用程序开发方面都有一定的经验,但除了应用程序模板之外,我以前从未真正接触过安全的主题。

我想象的是一个"简单"的登录系统,比如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或其他格式打印出用户。当设备成功登录时,我将应用程序中的用户对象(现在包含用户名(可能还有UserID、电子邮件、地址等)转换为NSData*,并使用NSKeyedArchiverNSKeyedUnarchiver保存和加载用户,再也不进行身份验证。如果用户单击"注销",我会清除此"存档"。这是有效的,但我感觉这不是一种特别安全的方式。如果是这样,那到底是为什么?

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

密码传输

确保安全的简单方法是通过SSL发送密码。如果您设置了SSL证书并通过https进行所有身份验证,则所有来回通信都由传输层加密。注意——md5不是一种加密算法,它是一种弱哈希算法——为了安全起见,不要使用它。

存储登录

您的密码应该以salted散列(随机salt,带有诸如SHA256之类的抗冲突散列函数)的形式存储在数据库中。不要将明文版本的密码存储在任何地方。如果你在服务器端使用PHP,你可以使用新的password_hash()函数或crypt()来生成和比较你的盐水散列。

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

如果你想安全地存储你的用户名/电子邮件/地址或其他相关信息,内置钥匙链是苹果唯一满意的方法。

看看SSKeychain(或PDKeychain或UICKeychain),并将其扩展到包括您想要存储的每个属性。通常,它用于存储用户名和密码组合,但可以扩展为安全地存储任意数据

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

如果你愿意,我可以提供例子。

另一个选项是添加某种OAuth或XAuth登录进程。

这样,您就不存储任何密码,而只存储所谓的"令牌"。令牌过期,并且可以被吊销。

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

Alex

最新更新