ユーザーを認証するために 2 つの Base64 でエンコードされたトークンを使用する NodeJS を使用してアプリケーションを作成しています。2 つのトークンが XOR されると、データベースに格納されている 3 番目のトークンと一致する必要があります。
これは私が今持っているものです:
function verifyTokens(encodedTokens) {
var similarity = 0;
var buffers = encodedTokens.map(base64.decode);
for (i = 0; i < TOKEN_LENGTH; i++) {
if ((buffers[0][i] ^ buffers[1][i]) === buffers[2][i]) {
similarity += 1;
}
}
return (similarity === TOKEN_LENGTH);
}
これは、タイミング攻撃に対して安全ではないと思います。なぜなら、 に 1 を追加すると、similarity
おそらく何もしないよりも時間がかかるからです。また、JavaScript の等値演算子がどれほど安全なのかもわかりません。
私の目を引いたバッファを操作するための別のソリューションはnode-buffertoolsですが、これはバッファを比較するために使用memcmp
されます (これは安全ではないことを理解しています)。
タイミング攻撃を回避するために、XOR された 2 つのバッファーと 3 番目のバッファーを比較する最良の方法は何ですか? 私は、C++ 拡張よりも JavaScript のみのソリューションを好みます。