安全なRails文字列比較

タイミング攻撃を防ぐために文字列比較は Rack::Utils.secure_compareを使いましょう、という話。

タイミング攻撃(タイミングこうげき、英:timing attack)とは、アルゴリズムの動作特性を利用したサイドチャネル攻撃のひとつ。暗号処理のタイミングが暗号鍵の論理値により変化することに着目し、暗号化や復号に要する時間を解析することで暗号鍵を推定する手法[1]。

タイミング攻撃 - Wikipedia

パスワードハッシュやトークンなどの文字列を比較する際には、== ではなく Rack::Utils.secure_compare を使ったほうが良い

機密情報に関わる文字列の比較は == ではなく secure_compare を使おう

注意点

最初に bytesize の真偽値を比較しているので、下記のようなリスクはある点は注意。

タイミング攻撃で、本当の文字列の 長さ を推測されてしまう危険性はあります。

Rack::Utils.secure_compare はたしかに、タイミング攻撃による「文字列そのものの推測」は防ぐことができます。しかし、「文字列の長さの推測」までは防げない可能性があります。

機密情報に関わる文字列の比較は == ではなく secure_compare を使おう