パスワードのハッシュ化について説明します。
先日、Twitterがユーザーのパスワードをハッシュ化せずに保存していた問題が発覚し、全ユーザーにパスワードを変更する旨の連絡がありました。
僕は、Twitterのパスワード認証を2段階認証で設定しているので、パスワード変更しなくてもいいかなと思いましたが、自分のパスワードが流出している可能性を考えると気持ち悪いので、パスワードを変更しました。
We recently discovered a bug where account passwords were being written to an internal log before completing a masking/hashing process. We’ve fixed, see no indication of breach or misuse, and believe it’s important for us to be open about this internal defect. https://t.co/BJezo7Gk00
— jack (@jack) 2018年5月3日
通常Twitterでは、ユーザーがパスワードを保存する際、BCryptと呼ばれるアルゴリズムを使ってパスワードをハッシュ化しています。が、Twitterのシステムにバグがあって、ハッシュ化される前に平文のパスワードがテキストで残ってしまった模様です。
パスワードをハッシュ化といっても、「ハッシュ化って何」という方も多いはず。
なお、今日のエントリーは、「ハッシュ化」という言葉を初めて聞いた一般ユーザーに向けて書きます。ハッシュ化について熟知しているエンジニアの方はスルーしてください。
今日のエントリーを読んで、TwitterやFacebookなどのウェブサービスで、自分のパスワードがどのように保管されているのか、意識するきっかけになればと思います。
ハッシュ化とは?
ハッシュ化とは、アルゴリズムを使うことで、元データの数値を、ランダムな固定長の値に変換する「不可逆変換」のことを指します。
「不可逆変換」なので、一度変換した数値を元に戻すことはできません。
元データが同じ値の場合、常に同じ「ハッシュ値」が生成されます。が、「ハッシュ値」から元データを復元することは不可能です。要するに、元データを秘匿することができるのです。
パスワードをハッシュ化するば、安全にパスワードが保管できる
ハッシュ化は「不可逆変換」ですので、パスワードをハッシュ化すれば、安全にパスワードを保管できます。そのため安全にパスワードを保管する際に、ハッシュ化は、よく使われます。
多くのウェブサービスのログイン認証では、「ユーザーのパスワード」をアルゴリズムを使って「ハッシュ値」へ変換して、「ハッシュ値」を保管しておき、ユーザーがログインする際、「ユーザーが入力したパスワード」と「ハッシュ値」を比較して認証することになります。
ウェブサービス側にパスワードが平文で保管されるわけではないので、ユーザーは安心して自分のパスワードをサービス側に預けることができるのです。
ハッシュ関数
元データから「ハッシュ値」を生成するには、ハッシュ関数が用いられます。
ハッシュ関数を使うこどのようなことができるかについてはWikipediaに詳しく載っているので引用します。
ハッシュ関数は主に検索の高速化やデータ比較処理の高速化、さらには改竄の検出に使われる。例えば、データベース内の項目を探したり、大きなファイル内で重複しているレコードや似ているレコードを検出したり、核酸の並びから類似する配列を探したりといった場合に利用できる。
ハッシュ関数とはどんなものがあるのか見ていきましょう。
- BCrypt
- SHA-256
BCrypt
bcryptとは、「blowfish」暗号のアルゴリズムに基づいたパスワードのハッシュ関数です。
SHA-256
SHA-1の改良版であるSHA-2に基づいたハッシュ関数です。SHA-256は32ビットのワード長から計算されます。
どんなところで使われているかの言えば、SSL/TLS・ビットコインなどで利用されています。
ハッシュ化されれば、パスワードは安全なのか?
ハッシュ化は「不可逆変換」なので、一度変換した数値を元に戻すことはできません。基本的にはハッシュ化されれば、パスワードは安全に保管されることになります。
ただし、ウェブサービス側が、ハッシュ化の処理にバグがないという前提があって初めて成り立ちます。
今回のTwitterのように、平文のパスワードがテキストで残ってしまうと、ハッシュ化の意味が全くありませんからね。ハッシュ化されているウェブサービスでも、何かのバグで自分のパスワードが流出する可能性はあるということを認識しておいてください。
パスワードはウェブサービス毎に、全て異なるものにすべし
今回のTwitterのようなケースもあるので、パスワードはウェブサービス毎に、全て異なるものにすることを強くオススメします。
同じパスワードを使い回すのは絶対にダメです。どこか脆弱なECサイトなどでIDとパスワードのリストが流出してしまうと、様々なサービスで不正ログインが行われてしまいます。
ChromeやSafariを使っているならば、クラウドでパスワードを保存できますので、利用することをオススメします。
さいごに
以上、パスワードのハッシュ化についてでした。
ハッシュ化とは、アルゴリズムを使って、元データの数値をランダムな固定長の値に変換する「不可逆変換」のことです。なので、基本的にはハッシュ化されたパスワードが復元されることはありません。
ただし100%完璧ではありませんので、ハッシュ化の処理にバグがあると、自分のパスワードが流出してしまう危険性もあることは頭に入れておいてくださいね。
ナレッジ