2022-10-17 安全なRails文字列比較
安全なRails文字列比較
タイミング攻撃を防ぐために文字列比較は Rack::Utils.secure_compare
を使いましょう、という話。
タイミング攻撃(タイミングこうげき、英:timing attack)とは、アルゴリズムの動作特性を利用したサイドチャネル攻撃のひとつ。暗号処理のタイミングが暗号鍵の論理値により変化することに着目し、暗号化や復号に要する時間を解析することで暗号鍵を推定する手法[1]。
パスワードハッシュやトークンなどの文字列を比較する際には、== ではなく Rack::Utils.secure_compare を使ったほうが良い
機密情報に関わる文字列の比較は == ではなく secure_compare を使おう
注意点
最初に bytesize
の真偽値を比較しているので、下記のようなリスクはある点は注意。
タイミング攻撃で、本当の文字列の 長さ を推測されてしまう危険性はあります。
Rack::Utils.secure_compare はたしかに、タイミング攻撃による「文字列そのものの推測」は防ぐことができます。しかし、「文字列の長さの推測」までは防げない可能性があります。