2016-11-09 47 views
1

我正在构建浏览器扩展,NodeJS应用程序(服务器)和C#应用程序之间的通信线。我需要使用像Diffie-Hellman或ECDH这样的方法在每个实例之间交换密钥,以便我可以开始加密敏感数据。是我可以在NodeJS,CSharp和WebCrypto之间使用DH/ECDH方法吗?

通信线路如下:

浏览器 < - >节点 < - >CSHARP

浏览器需要仅与节点通信,并且CSHARP应用程序也只需要与节点进行通信。

我需要找到执行某种像ECDH密钥交换,在大多数浏览器(可browserified节点代码)的作品和对端的NodeJS兼容实现的方法。我需要找到另一种方法来在NodeJS和C#之间做同样的事情。

我可以看到C#中有很多使用ECDH的例子(例如:https://blogs.msdn.microsoft.com/shawnfa/2007/01/22/elliptic-curve-diffie-hellman/),但我没有看到像使用Node一样的ECDH曲线。在这些平台之间进行密钥交换有一些常见的方式吗?

回答

0

实际上WebCrypto不支持DH--它被排除在最新版本的标准之外。因此唯一的选择是ECDH。

如实例你可以检查this link。还有一个相同代码here的“现场示例”。请注意,目前PKI.js是唯一使用WebCrypto并具有CMS加密所需的所有库。

至于Node.js的 - 你可以使用相同的PKI.js库和任何WebCrypto“中间层”或“polifill”。

至于C# - 微软的Crypto API支持ECDH(其实就是支持通过CNG,但它不是那么重要)。

+0

谢谢!垫片的想法应该很好。在进一步挖掘之后,似乎CSharp具有可用于ECDH的曲线规范(https://msdn.microsoft.com/en-us/library/system.security.cryptography.cngalgorithm(v=vs.110).aspx),但我如何将它们与Node节点相匹配?举例来说,我有一些约定俗成的“ECDiffieHellmanP521”和C#的一面“ECDiffieHellmanP384”,但没有对节点侧类似的迹象,也许除了“secp521r1”和“secp384r1” ... –

+0

你至少可以尝试的。这看起来是正确的。 –

+0

我尝试了C#端的ECDiffieHellmanP256和javascript中的prime256v1曲线。同时使用C#端的公钥来计算秘密,它会引发错误。 (未知)的事件处理程序中的错误:错误:未知点格式在ShortCurve.decodePoint(background.js) at KeyPair._importPublic(background.js) at new KeyPair(background.js) at Function.fromPublic(background .js:34695:10) at EC.keyFromPublic(background.js:34473:18) at ECDH.computeSecret(background.js:31187:28) –

相关问题