向服务器发送密码

4
由于CGI的限制,我的Web服务器不允许使用PHP_AUTH_USERPHP_AUTH_PW关键字(参见Col. Shrapnel在“PHP_AUTH_USER not set?”中的解释),因此我正在研究其他发送用户密码到服务器的方法。
使用POST以明文形式发送密码是不可行的:捕获数据包并查看标头会显示密码。所以我可以先对密码进行哈希处理。但是,截取数据包并复制哈希和用户名的人仍然可以使用此信息登录,对吗?
通过使用时间戳使哈希动态化可以防止复制哈希。将密码作为(timestamp + hash(password+timestamp))发送(Last.FM使用类似的方法)。然后服务器可以减去时间戳(检查是否过期之类的),并使用已知密码进行哈希处理,并检查它们是否相同。但是,密码必须为服务器所知,因此问题仍然存在:
如何在注册时安全地将此密码传输到服务器?
然后,有HTTPS,需要SSL证书,但我没有这个证书(还不值得花这些钱?)。
有什么想法吗?
附言:最终我想对我的Web服务器进行Android应用程序身份验证。

4
有免费的SSL证书,如果你不介意浏览器对自签名证书报错,你可以自己创建。 - Marc B
为什么需要在服务器端设置密码?密码应该对您和用户都是安全的。您应该保存编码后的密码,并比较编码值,而不是读取真实密码。这是一种安全的用户方式。因此,时间戳解决方案可以用于将密码发送到服务器。 - Rodrigo.C
客户端将密码与时间戳连接起来,并对其进行哈希。然后再次附加时间戳。 服务器将减去时间戳,并将其附加到存储在数据库中的密码上。对其进行哈希,并检查结果是否相等。(当我说密码时,我也可以说密码的哈希值)。此外,这最好作为注释。 - nhaarman
那改变了事情。我会去看看的。 - nhaarman
自签名证书。不会被拒绝,因为这不取决于用户,而是取决于您的服务器和客户端。此外,哈希和添加时间戳也可以实现... - Alfabravo
有没有关于如何在注册时安全地将密码传输到服务器的想法(无需使用 SSL)?因为我无法在那里使用时间戳方法。 - nhaarman
2个回答

1

在我需要对发送到服务器的数据进行安全级别保护时,我使用了类似的系统,使用固定长度的客户端派生密钥对数据进行哈希处理,将该密钥附加、前置或交错,并将结果字符串转换为十六进制。理论上,如果拦截,该字符串可以被解码,但实际上,您至少需要一些关于用于派生密钥的模式的想法。


但是仍然需要交换“基本”密码,双方都可以对其进行哈希处理。我该如何安全地做到这一点? - nhaarman
1
如果您使用此方法,请务必混淆您的代码!当您反汇编apk时,代码的可读性是令人恐惧的。 - William Melani
@Niek:任何安全机制都没有绝对的安全性。解决方案需要与风险相称。 - SourceMaid

0
如果安全对您来说真的很重要,我会选择像HTTPS这样的东西。如果您无法使用它,也许可以考虑更换网络主机或者其他限制?如果资金是问题,那么在问题评论中有一些建议(免费的,自签名的等)。
这种带有时间戳的哈希算法最终只会成为安全性通过混淆相关问题)。
虽然我不是安全专家,但我知道安全非常非常难,而想要入侵的人通常比我聪明。因此,我尝试保持简单,并使用经过广泛测试的常见解决方案,而不是尝试提出自己的“聪明”想法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接