SSL替代 - 使用JavaScript加密密码提交给PHP解密

zua*_*auz 5 javascript php encryption ssl public-key-encryption

我正在建立一个网站,我的付款方式将是Google Checkout和Paypal.将有链接/按钮将用户重定向到安全的Google/Paypal网站以处理付款.这意味着我不需要每年150美元的额外费用和为我的网站安装SSL证书的复杂性.

但是我想在登录时加密用户的密码,这样如果他们在网络上,一些运行FireSheep等的恶意人员在发送到服务器时无法读取用户的实际密码.该网站的其余部分不需要加密,因为它不是真正敏感的数据,可能会显着降低用户体验.

我的想法是,这可以通过公钥加密实现.让我们说这个过程是这样的:

  1. 公钥是在JavaScript外部文件中,服务器上的PHP中的私钥
  2. 用户在表单中输入用户名和密码,然后单击"提交"
  3. JavaScript运行并加密密码,并将其存储在文本字段中
  4. 表单提交给服务器,密码用PHP解密
  5. PHP中的纯文本密码被加盐和散列,然后与数据库中的散列进行比较.
  6. 注册/更改密码功能的可能类似过程.

我在想像RSA会做的事情.但我已经在网上寻找一个可以运行的JavaScript库,但似乎没有一个与可用的PHP库兼容.无论如何,它需要生成一组与JavaScript和PHP兼容的密钥.

有人知道这个实际工作的解决方案吗?如果不是我们写一个然后开源它.不幸的是,编写加密/解密代码非常复杂,因此我并不确切知道现有库正在做什么以及如何修改它们以使其工作.我已经有会话固定/劫持的保护,所以我对此不感兴趣.只是有兴趣在数据到达Web服务器之前对其进行加密.

注意:请不要将一堆链接发布到独立的Javascript或PHP加密库,我已经在Google上发现了这些链接.这实际上并没有用.我需要的是JavaScript加密和PHP解密的代码,它们实际上和谐地协同工作以产生上面概述的预期结果.

此外,如果你可以避免发布像"只使用SSL"这样的评论.我实际上想要解决这个确切的问题,即使这不是最佳实践,但它会很有趣.

非常感谢!

dec*_*eze 18

只有一个问题:攻击者不需要知道实际的密码.他需要看到的只是发送到服务器的值.该值允许用户登录.该值是什么并不重要; 无论是纯文本,加密文本还是猫的图片.它只是一个验证用户身份的令牌.如果攻击者可以看到此令牌并重复相同的请求并且同一请求允许他登录,则您什么也得不到.

  • @ 0A0D我说我甚至不感兴趣*解密你的加密密码.:)我只是嗅探您发送到服务器的加密密码并伪造完全相同的请求,将相同的加密密码发送到服务器,这将允许我以与您相同的方式登录.如果没有nonce,这种重放攻击是微不足道的,我不关心你是否以及如何或多久加密一次密码. (4认同)
  • @ 0A0D这就是重点,他们不需要实际解密它. (2认同)
  • @deceze点了.SSL证书定价现在终于在域名注册定价的范围内,所以没有什么借口.但是,我宁愿希望浏览器支持匿名SSL,而不会抛出一个大的可怕警告并且不显示任何"安全连接"chrome,因此它看起来就像一个常规的不安全连接.如果不出意外,这会让劫机者的生活变得更加困难 - 他们不得不去MITM,而不仅仅是嗅闻. (2认同)

Jef*_*tin 7

RSA过度杀伤; 您可能需要的是一个简单的挑战 - 响应协议.例如:

  • 生成随机nonce值; 这有助于防止重播攻击.
  • 将该nonce值和密码salt与其他登录表单一起发送到浏览器.
    • 您正在以盐渍和散列形式存储密码,对吧?
  • 当用户输入密码时,让表单上的脚本计算并发送回哈希(hash(密码,盐),nonce).
  • 当服务器收到表单提交时,让它计算hash(storedSaltedPassword,nonce)并验证它是否等于提交的值.
    • 保留服务器上的nonce值; 不要相信客户回复给你,否则你的重播保护就会消失.

这种方案的缺点是数据库中的密码哈希在某种意义上是密码等效的; 虽然提取用于生成这些哈希的原始密码可能不可行,但是存储哈希的知识足以模拟您网站上的用户.

SSL证书用于完全不同的目的:SSL证书的目的是使第三方流氓服务器难以声称自己是您的服务器,因为它没有由某个相互信任的第三方签署的证书属于您的域名.另一方面,如果您无法阻止恶意服务器冒充您的用户,则无法保护您的用户不要将密码提供给该恶意服务器,尽管加密.

  • @zoszsoz此协议仅适用于密码验证,不适用于帐户创建或密码更改.帐户创建是一个艰难的过程,因为您没有现有的信任锚,但Diffie-Hellman密钥协议,然后使用生成的密钥来加密密码,就足以阻止被动嗅探器. (2认同)

Mar*_*cka 2

http://www.jcryption.org/ - 是您正在寻找的组合。