我正在开发一个iOS应用程序,用户可以填写密码。然后使用POST或GET将密码发布到我站点上的PHP页面。 (它必须是纯文本,因为它在脚本中使用。)
除了HTTPS,有什么办法可以保护密码吗?在Obj-C中加密,然后在PHP中解密它?
注意:不会发送用户名...只有密码才会发布到服务器。
编辑: 为了澄清,David Stratton是正确的......我试图阻止公共场所的恶意嗅探器在发布到服务器时简单地读取明文密码。
答案 0 :(得分:9)
挑战响应大纲
让我们假设你有单向散列函数abc
(在实践中使用 一个用于PHP的加密强散列算法,请参阅:{{ 3}})。md5
或sha1
您在数据库中存储的密码为abc(password + salt)
(单独存储salt
)
服务器生成随机挑战challenge
并将其发送到客户端(使用salt
)并计算预期响应:abc(challenge + abc(password + salt))
客户端然后计算:abc(user_password + salt)
并应用challenge
获取abc(challenge + abc(user_password + salt))
,然后发送到服务器,服务器可以轻松验证有效性。
这是安全的,因为:
有一些问题:
你怎么知道送什么盐?好吧,我从来没有真正找到解决方案,但使用确定性算法将用户名转换为盐可以解决这个问题。如果算法不具有确定性,则攻击者可能会找出存在哪个用户名,哪些用户名不存在。这确实需要您拥有用户名。或者你可以只使用静态盐,但我对密码学知之甚少,无法评估该实施的质量。
答案 1 :(得分:6)
重新考虑不使用HTTPS。 HTTPS可以很好地防御多种攻击。
通常没有理由传输密码。通过传输密码,您将发送有价值的数据,并且与之相关的风险更大。
通常您对密码进行哈希并提交哈希值。在服务器端,你比较哈希,如果它们匹配,那就很好。
显然,使用这种方法,哈希很重要,你必须防止重放攻击。您可以让您的服务器生成加密安全的一次性使用盐,将其传递给客户端,盐和哈希密码,并比较哈希服务器端。
您还需要防止对密码进行反向哈希攻击。 IE,我有一个哈希,我可以将它与一堆预先生成的哈希进行比较,以找到原始密码。
答案 2 :(得分:2)
您可以在设备上进行加密并在服务器上进行解密,但如果通过线路的数据足够敏感以保证那么多工作,那么恕我直言,我相信您最好只使用https。它经过了尝试,真实和成熟。
这不是完美的,请注意,并且已经有成功的攻击它的旧版本,但它比“滚动你自己的”安全方法要好得多。
假设您的密钥遭到入侵,例如:如果您使用https和受信任机构的证书,那么您只需购买新证书。如果它信任当局,则会接受新证书。如果您使用它自己的路线,那么您不仅要在Web服务器上更新密钥,还要在客户端更新密钥。 我不希望那种头痛。
我并不是说挑战是不可克服的。我说当工具已经存在时,这可能不值得。