1

特定の入力が保存されたパスワードと一致するかどうかを確認する必要があるアプリケーションがあります。

これは、コードの単純化されたサンプルです。

int authorize_(const uint8_t input[restrict HASH_SIZE], const uint8_t password[restrict HASH_SIZE])
{
    // Compare each byte to prevent timing attacks. Make sure the compiler doesn't optimize the comparison.

    unsigned diff = 0;
    size_t index;

    for(index = 0; index < HASH_SIZE; ++index)
        diff += (input[index] != password[index]);

    return diff;
}

#define authorize(i, p) (bool)(authorize_((i), (p)) == 0)

タイミング攻撃について読みましたが、これが私の解決策です。関数 authorize_ は常にすべての文字をチェックして、チェックに常に同じ時間がかかるようにします。外部関数は結果が 0 かどうかだけを気にするので、チェックを行うマクロがあります。

ただし、リンク時の最適化によって関数が最初の不一致で停止する可能性があるかどうかが心配です (diff は既に != 0 であり、値を増やすことしかできないため)。

私は心配する必要がありますか?または、私は何か完全に間違っていますか?

4

0 に答える 0