没有Java的基于浏览器的SRP



我正在考虑实现安全远程密码协议,以便在浏览器和我的web应用程序之间进行零知识密码证明。SRP网站提供了一个示例,但它需要java来执行计算。我想知道是否有可能在不使用Java的情况下使用javascript实现SRP,因为我不想要求我的用户安装Java,特别是因为我的受众将是一个具有安全意识的人,他们可能会考虑启用Java插件的风险比零知识密码证明对他们的安全带来更大的风险。

这里是他们的演示链接:http://srp.stanford.edu/demo/

我想知道是否可以使用javascript实现SRP而不使用Java,

如果你正在寻找一个标准化的方法,答案是NO。

WebCrypto工作组现在正在对一些加密操作进行标准化。然而,WG已经声明,他们不会提供对模块化操作所需的底层BigInt原语的访问,因此在第一个版本中您将无法获得所需的原语。您可能会在后续版本中获得它。参见他们邮件列表中关于BigInteger操作的问题。

Update : WebCrypto工作组也不打算将Diffie-Hellman作为标准的一部分。Chrome团队甚至不打算提供Diffie-Hellman作为扩展。他们声称对Diffie-Hellman也没有用例或需求。从他们的邮件列表中查看WebCrypto中的Diffie-Hellman。

你也许可以在Javascript库中找到它,但我认为它会很慢(或比本机实现慢)。


相关的,请记住,那些拒绝你使用bigint和Diffie-Hellman的人,就是那些在浏览器安全模型中规定"拦截是一个有效用例"的人。

他们也是破坏HTTP的RFC 7469公钥绑定扩展的人。有关详细评论,请参阅关于draft-ietf-websec-key-pinning的评论。更糟糕的是,当他们被要求提供覆盖和破坏安全通道时,他们将Draft 21中的语言更改为Final,使其更加模糊和隐藏。

我在KeeFox中使用SRP客户端。它是一个Firefox插件,所以在向后兼容性、跨浏览器支持等方面问题较少。我想稍微修改一下的版本可以在大多数现代浏览器中工作。

它很慢,但对于偶尔使用它(每次Firefox会话最多一次)来说仍然足够快。

灵感来自http://code.google.com/p/srp-js/

您可以在https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/SRP.js

查看最终结果

为了我的目的,我已经优化了一个往返,但是你必须评估你自己的用例,以确定我的特定实现是否安全。

我在尝试的前几个BigInteger库中遇到了麻烦(对于SRP所需的操作,大多数库似乎都有错误),但最终选择了https://github.com/luckyrat/KeeFox/blob/master/Firefox%20addon/KeeFox/modules/biginteger.js

我刚刚重新查看了原生BigInteger支持,但看起来仍然没有任何选项。

从firefox插件的角度来看,我想知道js-ctypes是否可以访问一些firefox的内部结构,使我能够加快一些速度,但是我看到我以前使用ctypes的唯一原因是与自实现以来发布的10个firefox版本中的2个版本不兼容,所以除非必要,否则我不会使用它们。

Thinbus在npm上的https://www.npmjs.com/package/thinbus-srp有一个纯javascript客户端库,它执行SRP到java服务器(Edit或PHP服务器)。如果你没有在你的web中使用java或PHP,那么将服务器逻辑移植到你的web应用程序中应该是相当直接的,因为它只使用标准的SHA256哈希和BigInteger数学,这些将在其他语言中可用。

最新更新