使用Diffie-Hellman密钥交换和AES进行客户端HTTPencryption
在观看Diffie-Hellman密钥交换中的YouTubevideo后,我想尝试使用JavaScript实现(阿特伍德定律)。
我使用以下规则在Node.js上绘制了一个密码:
-
第1步:客户端和服务器在共享密钥上达成一致:
-
客户端和服务器从512位主要公钥pK开始
-
客户端生成一个512位主密钥kC,并发送powMod(3,kC,pK)
-
服务器生成一个512位主密钥kS,并发送powMod(3,kS,pK)
-
客户端和服务器使用powMod(response,privatekey,pK)作为共享密钥
-
-
第二步:沟通
-
在客户端发送数据之前,使用Stanford Javascript Crypto Library(256位AES,HMACauthentication,PBKDF2密码加强和CCMauthenticationencryption)使用共享密钥encryption。
-
一旦服务器使用共享密钥解密数据,它将生成一个新的512位主密钥,并将其作为SJCLencryption响应发送。
-
客户端和服务器使用powMod(3,prevSharedKey,newPrivKey)切换到新的共享密钥
-
现在我有几个问题
与HTTPS或其他algorithm相比,这样的系统有多安全? 这种制度最薄弱的地方是什么?
在安全性/实用性方面,使用1024位密钥更好的安全性会更好吗? HMAC / PBKDF2 / CCM选项是否过度杀伤? 是否值得调整共享密钥? 谢谢阅读!
我曾经见过这样的问题 – 由于多种原因 ,这是完全不安全 的 ,其中最主要的是JavaScript客户端无法validation服务器的密钥是否可信。
简而言之,没有SSL,就容易受到中间人攻击。 没有基于浏览器的JavaScriptencryption实现可以克服这个事实。
你的系统是大规模的不安全的,但我不是想阻止你或任何人玩弄这样的东西。 你应该继续。 但是,至关重要的是,您认为您创build的任何东西都是“玩具”系统,绝对不应该被视为“安全”或被宣传为“安全”。
我们把安全问题分成两部分。
- 密钥交换有多安全?
- 一旦获得共享密钥,您使用的encryption有多安全?
我先回答(2),因为那将是最简单的。 除非你比那些多年来从事和研究过红绿灯系统的人都聪明,否则这将是非常不安全的。 在1.2版之前的TLS(很less有站点使用)在原则上容易受到select的密文攻击(CCA)的影响,在实践中受到密码套装select的影响。 而且SSL 2.0更糟。
关键是非常非常聪明的人,在这些协议上工作多年,有些事情是错误的。 有充分的理由相信你是我自己在做这些事情会犯很大的错误。 基本的encryptionalgorithm很好。 他们没有破碎。 但协议是。
所以,如果你没有学习和完全理解SSL的所有细节,为什么他们在那里,在某些情况下他们是怎么出错的,那么几乎可以肯定的是,你devise的任何协议都是可怕的。
现在来质疑(2)。 这有两个问题。 (a)Diffie-Hellman不是为了提供您可能需要的种类的安全性而devise的; 和(b)我不认为你已经正确实施了DH。
2.A:
Diffie-Hellman密钥交换(如果正确完成)对于密钥交换来说是安全的,但它对于身份validation没有任何作用。 这就是为什么“安全”这个问题往往是错误的问题。 对某些目的来说是安全的,但是对于其他目的而言,这是不安全的。
正如Josh3737所指出的那样,客户端和服务器无法知道他们正在与正确的方进行对话。 如果山姆是服务器,查理是客户,那么没有什么能够阻止马洛里build立自己的服务器来伪装山姆。 所以凯茜可以通过与马洛里的重要交stream,认为她正在和山姆交谈。 与马林谈话时,马洛里可以假扮成查理。
一旦这样做,马洛里可以扮演一个山姆和查理之间的中间人。 当Charlie发送给Sam的数据时,Mallory将使用C和M之间的共享密钥对它进行解密,然后读取(并可能改变它),然后重新encryptionM和S之间的共享密钥,并将其发送给S 。
为了解决authentication问题,你需要某种公钥基础设施(PKI),这真的很痛苦。 证书颁发机构和SSL / TLS的系统充满了问题,但它仍然是最好的系统。
2.B:
一个512位的公共模数和512位私钥不够强大。 DH键需要更大。 我不会用任何less于2048位的东西去。 你可能会离开1024位,你不担心有人能够打破五年的今天的秘密。
你没有提供足够的关于你的素数是如何select的信息。 不是每个素数都能工作。 你需要为你的模数使用一个“安全素数”,否则攻击者就有快捷方式来计算离散对数。
如果你想解决中间问题的SSL证书和人,你可以使用比特币区块链。 (或者一个altcoin区块链。)
巨大的警告:客户必须下载或维护整个区块链文件。
有两个公钥/私钥对:
CERTpublicCERTprivate
CLIENTpublic CLIENTprivate
名字注册:
Server -> CERTpublic and name_to_register -> Bitcoin Blockchain
authentication连接:
Client <- CERTpublic <- Bitcoin Blockchain Client -> CERTpublic(CLIENTpublic) -> Server or Adversary Client <- No_response_or_incorrect <- Adversary Client <- CLIENTpublic(CERTprivate(content)) <- Server
- 在ColdFusion中encryption,在Node.js中解密
- 是否可以使用node-webkit文件解码AESencryptionvideo?
- 用python和nodejsencryption和解密
- mongodb,node.js和encryption的数据
- Java BouncyCastle中的确定性AES-CTR?
- 节点encryption解码stream抛出EVP_DecryptFinal_ex:如果stream将被中断,则错误的最终块长度
- .NET和nodejs之间的AESalgorithm值差异,CryptoJS
- 在节点中encryption并在java中解密
- Node.js Crypto类使用更新的版本返回不同的结果