我正在考虑实现安全远程密码协议,在浏览器和我的Web应用程序之间进行零知识密码证明。SRP网站提供了一个例子,但它需要java来执行计算。我想知道是否可以使用javascript实现SRP而不使用Java,因为我不想要求我的用户安装Java。特别是因为我的听众将是具有安全意识的听众,他们可能认为启用Java插件的风险比零知识口令证明对他们的安全性的风险更大。
下面是他们演示的链接:http://srp.stanford.edu/demo/
我正在考虑实现安全远程密码协议,在浏览器和我的Web应用程序之间进行零知识密码证明。SRP网站提供了一个例子,但它需要java来执行计算。我想知道是否可以使用javascript实现SRP而不使用Java,因为我不想要求我的用户安装Java。特别是因为我的听众将是具有安全意识的听众,他们可能认为启用Java插件的风险比零知识口令证明对他们的安全性的风险更大。
下面是他们演示的链接:http://srp.stanford.edu/demo/
3条答案
按热度按时间i1icjdpr1#
我想知道是否有可能在不使用Java的情况下使用JavaScript实现SRP,
如果您正在寻找一个标准化的方法,答案是否定的。
WebCrypto Working Group现在正在为一些加密操作进行标准化。然而,WG已经声明他们不会提供对模块化操作所需的底层BigInt原语的访问,所以你在第一个版本中不会有你需要的原语。你可能会在后续版本中得到它。请从他们的邮件列表中查看Question on BigInteger operations。
更新:WebCrypto Working Group也不打算将Diffie-Hellman作为标准的一部分。Chrome团队甚至不打算将Diffie-Hellman作为扩展提供。他们声称,Diffie-Hellman也没有用例或需求。请从他们的邮件列表中查看Diffie-Hellman in WebCrypto。
您可能能够在Javascript库中找到它,但我认为它会很慢(或比本地实现慢)。
与此相关,请记住,拒绝BigInts和Diffie-Hellman的人正是在浏览器安全模型中规定“拦截是一个有效的用例”的人。
他们也是破坏RFC 7469 Public Key Pinning Extension for HTTP的人。详细的评论请参见Comments on draft-ietf-websec-key-pinning。更糟心的是,当他们被要求提供覆盖和破坏安全通道时,他们将Draft 21中的语言改为Final,使其更加模糊和隐藏。
htrmnn0y2#
我在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插件的Angular 来看,我想知道js-ctypes是否给予访问一些Firefox内部组件,这将允许我加快一点速度,但我已经看到我以前唯一使用的ctypes破坏了与10个Firefox版本中的2个版本的兼容性,因为实现,所以我谨慎地使用它们,除非它成为必要的。
r7xajy2e3#
Thinbus位于https://www.npmjs.com/package/thinbus-srp的npm上,它有一个纯javascript客户端库,可以执行到java服务器(Edit或PHP服务器)的SRP。如果您在Web中没有使用java或PHP,则应该相当直接地将服务器逻辑移植到您的Web应用程序,因为它只使用标准的SHA256散列和BigInteger数学,这将在其他语言中可用。