Node種bufferオブジェクト配列の深いコピー浅いコピー問題

3458 ワード

Nodeの1つの上位機と下位機が通信する転送プログラムはudp転送を用いる.
このうち送信時にはrc 4暗号化データが1回行われます
問題が発生したのは、アップグレードパケットのブロードキャスト送信であるため、この暗号化データのブロックです.アップグレード用のブロードキャストメッセージを事前に生成するbuffer配列であり、最初の4つの要素はアップグレード要求体であり、後ろはアップグレードパッケージ体である.
上位機制御プログラムの送信回数は、一般的に3回設定.
アップグレードパケットデータの送信は再帰呼び出し送信,アップグレードパケット送信方法を採用する
function sendUpgradePackage(gatewayId, buffer, port, address, sendnum = 1, index = 0, send = 0) {
  if (!common.upgradeflag[gatewayId].ret) {
    return;
  }
  if (index >= buffer.length) {
    send++;
    if (send >= sendnum) {
      common.upgradeflag[gatewayId].ret = false;
      return;
    } else {
      index = 0;
    }
  }

  console.log(index, send, '===>>>buff', buffer[index].toString('hex'));

  sendCipherMessage(buffer[index], 0, buffer.length, port, address, err => {
    if (err) {
      log.appendLog('send_error:' + err);
    }
  });
  index++;
  setTimeout(function() {
    sendUpgradePackage(gatewayId, buffer, port, address, sendnum, index, send);
  }, 100);
}

次にrc 4暗号化パケットのメソッドコード省略部分
  parseBody.buffer = databuffer.slice(cipherlen, cipherlen + parseBody.length);
        // console.log(' ', parseBody.deviceId, '=====>>>>>', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key);
        let decipher = crypto.createCipheriv('rc4', createwaytewaykey.GATEWAYKEYDIR[parseBody.deviceId].key, '');
        parseBody.buffer = decipher.update(parseBody.buffer);
        parseBody.buffer.copy(databuffer, cipherlen);

その中でdatabufferは伝わってきたbuffer[index]です
このパラメータを直接修正することで、1回目の送信時にデータが正常になり、2回目の送信時にデータがエラーになる.1回目の送信時に元のbuffer配列内の配列内容が変更するため、暗号化されたデータを再暗号化し、下位機ではデータを解析できなくなる.
この問題を調べた後、もう一つの問題が発見された.暗号化しない問題だ.デバッグ中にサービスを再起動し続けたため、サービスメモリにゲートウェイのkeyが保存されず、暗号化されていない.後続のネットワークが関心を持って飛び上がってから、後続の暗号化を開始した.
サービス全体が混乱しすぎて、多くの古い設備と互換性が必要で、その中のバイトストリームの解析の違いが大きすぎて、各種の判断で解析を行う.
上位機全体でもこの問題が発生する、機器などの問題により、テーブル構造全体が現在の機器記憶に適していない.しかし、再構築する時間もなく、大きな再構築もできず、api向けが雑すぎる.全身を引っ張る
この时间はすべてnodeのバックエンドをして、1つのグループを建ててバックエンドnodeのをしていっしょに交流することができます932491438