关于php:安全发送纯文本密码?

Securely send a Plain Text password?

我正在开发一个iOS应用程序,让用户填写密码。然后,使用post或get将密码发布到我的站点上的一个php页面。(它必须是纯文本,因为它在脚本中使用。)

除了https,还有什么方法可以保护密码吗?用obj-c加密然后用php解密?

注意:用户名没有发送…只有密码才会发布到服务器。

编辑:要澄清,大卫·斯特拉顿是正确的……我试图阻止公共场所的恶意嗅探器在发送到服务器时简单地读取明文密码。


挑战响应大纲

假设您具有单向哈希函数abc(实际上使用的是md5sha1A cryptography strong hashing algorithm for php,请参见:password_hash)。

您在数据库中存储的密码是abc(password + salt)(单独存储salt)

服务器生成一个随机挑战challenge,并将其发送给客户机(与salt一起),并计算预期的响应:abc(challenge + abc(password + salt))

然后客户端计算:abc(user_password + salt)并应用challenge得到发送到服务器的abc(challenge + abc(user_password + salt)),服务器可以很容易地验证其有效性。

这是安全的,因为:

  • 密码从不以明文发送或以明文存储
  • 每次发送的哈希值都会更改(减轻重播攻击)

有一些问题:

你怎么知道要送什么盐?嗯,我从未真正找到解决这个问题的方法,但是使用确定性算法将用户名转换为salt可以解决这个问题。如果算法不具有确定性,攻击者可能会发现哪个用户名存在,哪个不存在。但是,这需要您有一个用户名。另外,您也可以只使用一个静态的salt,但我对加密技术的了解还不足以评估该实现的质量。


重新考虑不使用HTTPS。https是一种很好的防御多种攻击的方法。

通常没有理由传输密码。通过传输密码,您发送的是有价值的数据,而这些数据又是与之相关的额外风险。

通常您散列密码并提交散列。在服务器端,您可以比较哈希值,如果它们匹配,那就太好了。

显然,使用这种方法,散列值是很重要的,而且您必须防止重播攻击。您可以让服务器生成一个加密安全的一次性使用salt,将其传递给客户机,salt并散列密码,然后比较hashes服务器端。

您还需要防止对密码的反向散列攻击。例如,我有一个哈希,我可以将它与一组预先生成的哈希进行比较,以找到原始密码。


你可以在设备上加密,在服务器上解密,但是如果通过网络传输的数据足够敏感,可以保证有那么多的工作,那么imho,我相信你最好只使用https。它是经过尝试的,真实的,并且已经建立起来了。

提醒你,它并不完美,而且已经有了针对旧版本的成功攻击,但是它比"滚动自己的"安全方法要好得多。

例如,假设您的密钥被编译了:如果您使用的是来自受信任的颁发机构的证书的HTTPS,那么您只需购买一个新的证书。hte deveice,如果它信任颁发机构,那么它将接受新的证书。如果按照自己的路线进行,那么不仅必须在Web服务器上更新密钥,还必须在客户机上更新密钥。我不可能想要那种头痛。

我不是说这个挑战是无法克服的。我是说,当工具已经存在时,可能不值得这样做。