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

时间:2011-04-20 01:38:28

标签: php javascript encryption ssl public-key-encryption

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

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

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

  1. 公钥位于JavaScript外部文件中,服务器上的PHP中的私钥
  2. 用户在表单中输入用户名和密码,然后点击提交
  3. JavaScript运行并加密密码,并将其存回文本字段
  4. 表单提交给服务器,密码用PHP解密
  5. PHP中的纯文本密码是咸的&哈希然后与数据库中的哈希进行比较。
  6. 注册/更改密码功能的可能类似过程。
  7. 我在想像RSA会做的事情。但我已经在网上寻找一个可以运行的JavaScript库,但似乎没有一个与可用的PHP库兼容。无论如何,它需要生成一组与JavaScript和PHP兼容的密钥。

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

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

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

    非常感谢!

5 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:3)

首先,我认为这不是一个好主意。我发现一些使用Google的例子可能对你有用(但我没有测试过这些):

GPL JavaScript Public Key Encryption

RSA Public Key Encryption Test in JavaScript

PGP Encryption in JavaScript

RSA Algorithm Example in JavaScript

你应该建立一些盐化机制来为每个加密值加盐,否则密钥可能会受到损害。

答案 3 :(得分:2)

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

答案 4 :(得分:1)

您无需加密密码。您需要哈希密码。您真的不希望自己有任何访问明文密码的权限,否则您将失去不可否认性,这会产生严重的法律后果。在继续之前,你需要彻底调查这个含义。