【问题标题】:How to make Diffie Hellman connection between client(CryptoJS) and server(Crypto Node.js)如何在客户端(CryptoJS)和服务器(Crypto Node.js)之间建立 Diffie Hellman 连接
【发布时间】:2018-09-02 21:44:53
【问题描述】:

我正在尝试在服务器和客户端之间建立连接。我使用 elliptic.js 创建 ECDH 密钥并尝试对消息进行密码解密。密钥在服务器和客户端上都是相等的。服务器之间一切正常,但服务器和客户端之间存在很多问题。

我做了很多工作来让客户端解密来自服务器的消息。但我无法在客户端上正确加密。服务器不明白。连客户都不理解。

我的客户端使用 Crypto JS(我尝试使用 forge 和 sjcl,但它们对我来说很容易理解),服务器使用 Crypto。 客户端上有我的功能:

cipherData(data, secret){       
  let encrypted = CryptoJS.AES.encrypt(data, secret).toString();
  return encrypted;
}

decipherData(encryptedData, secret) {
  let data;
  try {
      //make tranformations because of little features in crypto (node) - it uses empty salt array
      let ct = CryptoJS.enc.Hex.parse(encryptedData);
      let salt = CryptoJS.lib.WordArray.create(0); // empty array
      data = CryptoJS.AES.decrypt({ciphertext: ct, salt: salt}, secret);
      data = data.toString(CryptoJS.enc.Utf8);
  } catch (e) {
      console.log('Error decrypting data: ' + e)
  }
  return data;
}

服务器上有我的代码:

cipherData(data, secret, algorithm = 'aes256'){
  const cipher = crypto.createCipher(algorithm, secret);
  let encrypted = cipher.update(data,'utf8', 'hex');
  encrypted += cipher.final('hex');
  return encrypted;
}

decipherData(encryptedData, secret, algorithm = 'aes256'){
  const decipher = crypto.createDecipher(algorithm, secret);
  let data = decipher.update(encryptedData,'hex', 'utf8');
  data += decipher.final('utf8');
  return data;
}

也许有人可以帮助我? 计算的密钥例如(十六进制):e6922091e78adce7cff10e01b4eb949317e56ece3597a7daa23c819c6882a955

【问题讨论】:

    标签: node.js encryption cryptography cryptojs diffie-hellman


    【解决方案1】:

    经过多次尝试,我也决定使用 Crypto-JS 重新制作服务器端。这个决定是完全正确的。一切正常。

        cipherData(data, secret) {
            let encrypted = CryptoJS.AES.encrypt(data, secret).toString();
            let b64 = CryptoJS.enc.Base64.parse(encrypted);
            encrypted = b64.toString(CryptoJS.enc.Hex);
            return encrypted;
        }
    
        decipherData(encryptedData, secret) {
            let data;
            try {
                let b64 = CryptoJS.enc.Hex.parse(encryptedData);
                let bytes = b64.toString(CryptoJS.enc.Base64);
                data = CryptoJS.AES.decrypt(bytes, secret);
                data = data.toString(CryptoJS.enc.Utf8);
            } catch (e) {
                console.log('Error decrypting data: ' + e)
            }
            return data;
        }

    【讨论】:

    • 首先,您不应该实现自己的 DH,因为我敢打赌您做错了那部分:非密码学家的大多数实现都容易受到中间人的攻击。其次,没有理由这样做:只需使用 TLS。第三,除非您以原始格式使用 API,否则 CryptoJS 不会与许多其他库互操作(不要使用基于密码的加密——您似乎正在使用硬编码的全零盐,这也不好) .
    • 我没有实现我自己的 DH 我只是为算法的不同部分使用了两个库。用于密钥生成的椭圆和用于加密的 cryptoJS。这是错的吗?你能告诉我为什么 TLS 更好吗?
    • 如果您在没有身份验证的情况下执行 Diffie Hellman 是错误的,因为攻击者可以交换密钥并执行中间人。即使您注意这一点,您仍然需要通过 TLS 将您的 JavaScript 安全地提供给客户端,否则攻击者只会在那里注入他自己的恶意负载。因此,归根结底,您仍然需要回退到 TLS 以使其不易受到攻击。 TLS 已经为您完成了所有工作,因此无需添加只会让事情变得更糟的额外层:链的强度取决于其最薄弱的环节。
    猜你喜欢
    • 2020-11-28
    • 2016-07-30
    • 2019-05-24
    • 2012-04-24
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    相关资源
    最近更新 更多