我正在创建一个应用程序和一个我已经开始的项目的网站,但我不确定我应该怎么做才能登录。这不是“我是菜鸟,我想要一个登录的应用程序” -question。我对网络,数据库和应用程序开发都有一定的经验,但除了应用程序模板之外,我从未真正触及 security 的主题。
我想象的是一个像Skype,Facebook,NetFlix这样的“简单”登录系统,真的是你能登录的任何应用程序,它还有一个登录的网站。
我的一部分问题是关于流程的安全性。我最初的想法是,绝不应该通过互联网发送干净文本的密码,这使我相信在登录时,密码应该在手机上以及网站上进行散列/加密。我做了一些小事 - 时间哈希/加密之前,只需使用sha1
和md5
来“转换”文本。这样做的正确方法是什么?根据我目前的知识,我假设如果我使用md5
加密密码,任何人都可以使用md5
解密它,但我可以使用SALT
(?)或一些改变关键的形式。这就是“大男孩”是怎么做的,还是有一个我不知道的秘密通道?
现在进入真正的问题 ..我应该如何安全地存储登录信息?
我尝试过:在Xcode中为此做一个“测试项目”时,我只创建了一个User
类,其中包含username
字段。通过输入用户名和密码“登录”时,我只是将POST
- 方法HTTP-request
发送到我的.php
页面,该页面只执行SELECT * FROM User WHERE Username = '$_POST['username']' AND Password = '$_POST['password']';
如果数据库返回一行,然后密码是正确的,页面可以用JSON或其他方式打印出用户。当设备成功登录后,我在应用程序中转换了用户对象,现在包含用户名(可能包含用户ID,电子邮件,地址等)到NSData*
,并使用NSKeyedArchiver
和NSKeyedUnarchiver
保存并加载用户,永远不再进行身份验证。如果用户单击“注销”,我会擦除此“存档”。这有效,但我觉得这不是一种特别的安全方式。如果是这样,那为什么呢?
(我们的后端目前是谷歌的App Engine(java),它支持OAuth。有些人建议这样做,但我们找不到任何适合我们自定义用户计划的文档)
答案 0 :(得分:2)
密码传输
确保这一点的简单方法是通过SSL发送密码。如果您设置SSL证书并通过https执行所有身份验证,则传输层将对所有来回通信进行加密。注意 - md5
不是加密算法,它是一种弱哈希算法 - 不要将其用于安全性。
存储登录
您的密码应作为盐渍哈希(随机盐,具有抗冲突哈希函数,如SHA256)存储在数据库中。不要在任何地方存储密码的纯文本版本。如果您在服务器端使用PHP,则可以使用新的password_hash()
函数或crypt()
来生成和比较您的盐渍哈希值。
如果您通过SSL进行安全通信,则应该只需使用网络服务器的会话功能来跟踪登录信息(例如$_SESSION['user_id'] = ...
)。
答案 1 :(得分:0)
如果您想要安全地存储您的用户名/电子邮件/地址或其他任何内容,内置的keychain是Apple唯一可以开心的方式。
查看SSKeychain(或PDKeychain或UICKeychain)并对其进行扩展,以包含您要存储的每个媒体资源。通常它用于存储用户名和密码组合,但可以扩展为存储任意数据安全。
至于将安全数据传递到服务器,请通过HTTPS执行。
如果您愿意,我可以提供示例。
答案 2 :(得分:0)
另一种选择是添加某种OAuth或XAuth登录过程。
这样,您不会存储任何密码,只会存储所谓的“令牌”。令牌过期,可以撤销。
根本不存储用户名和密码是保护用户名和密码的最佳方式。
亚历