Node種bufferオブジェクト配列の深いコピー浅いコピー問題
3458 ワード
Nodeの1つの上位機と下位機が通信する転送プログラムはudp転送を用いる.
このうち送信時にはrc 4暗号化データが1回行われます
問題が発生したのは、アップグレードパケットのブロードキャスト送信であるため、この暗号化データのブロックです.アップグレード用のブロードキャストメッセージを事前に生成するbuffer配列であり、最初の4つの要素はアップグレード要求体であり、後ろはアップグレードパッケージ体である.
上位機制御プログラムの送信回数は、一般的に3回設定.
アップグレードパケットデータの送信は再帰呼び出し送信,アップグレードパケット送信方法を採用する
次にrc 4暗号化パケットのメソッドコード省略部分
その中でdatabufferは伝わってきたbuffer[index]です
このパラメータを直接修正することで、1回目の送信時にデータが正常になり、2回目の送信時にデータがエラーになる.1回目の送信時に元のbuffer配列内の配列内容が変更するため、暗号化されたデータを再暗号化し、下位機ではデータを解析できなくなる.
この問題を調べた後、もう一つの問題が発見された.暗号化しない問題だ.デバッグ中にサービスを再起動し続けたため、サービスメモリにゲートウェイのkeyが保存されず、暗号化されていない.後続のネットワークが関心を持って飛び上がってから、後続の暗号化を開始した.
サービス全体が混乱しすぎて、多くの古い設備と互換性が必要で、その中のバイトストリームの解析の違いが大きすぎて、各種の判断で解析を行う.
上位機全体でもこの問題が発生する、機器などの問題により、テーブル構造全体が現在の機器記憶に適していない.しかし、再構築する時間もなく、大きな再構築もできず、api向けが雑すぎる.全身を引っ張る
この时间はすべてnodeのバックエンドをして、1つのグループを建ててバックエンドnodeのをしていっしょに交流することができます932491438
このうち送信時には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