ワンタイムパスワード生成用の認証情報(シークレット)の暗号化の必要性
OneAuthを利用すると、2段階認証に使用するワンタイムパスワード生成用の認証情報(シークレット)を、Zohoのクラウド(サーバー)上にバックアップできます。また、複数の端末(デバイス)間で情報を同期し、必要に応じて復元処理を行うことも可能です。
バックアップと同期についての詳細はこちらをご参照ください。メモ:ワンタイムパスワードの生成においては、「シークレット」または「シークレットキー」と呼ばれる認証情報(ランダムな英数字の文字列)が用いられます。この認証情報は、認証を行う対象のサービス(例:Zoho、Google、Microsoft、Facebook、Twitter)から取得します。通常は、画面上のテキストとして表示された内容をコピーするか、画面に表示されるQRコードをスキャンして読み込むことで取得します。
OneAuthを通じて認証情報(シークレット)がバックアップされる際に、認証情報はそのままのテキストの形では保存されず、暗号化されてから保存されます。暗号化の処理には、OneAuthの設定で指定したパスフレーズが用いられます。暗号化を行うことで、ユーザー本人以外の人は認証情報を確認することができなくなります。不正な攻撃や盗聴を試みる第三者だけでなく、Zohoの関係者も確認はできません。
適切なアクセス権限を持ち、かつパスフレーズを知っているユーザー本人のみが、暗号化を解除(復号)し、認証情報を取得できます。これにより、認証情報が保護され、漏えいや不正利用を防ぐことができます。
OneAuthの旧バージョン(2.0)で用いられていた暗号化/同期方法とその問題点
OneAuthの旧バージョン(2.0)で用いられていた暗号化/同期方法には以下のような問題点があり、新バージョン(3.0)での対応が図られました。
1. 使用されていた暗号化方式(AES-ECB)の安全性が十分ではない
旧バージョン(2.0)では、AES-ECBと呼ばれる暗号化方式が用いられていました。この方式では、元のデータが複数のブロックに分割されたうえで暗号化されます。各ブロックのデータ自体は暗号化されていますが、元のデータが同じ場合、暗号化後のデータも同じになります。悪意を持った第三者が不正にデータを取得した場合に、暗号化された状態であっても元のデータのパターンや内容が推測されてしまう可能性があります。このため、安全性に課題がありました。
2. 復元用の通信時にパスフレーズが盗聴されるおそれがある
旧バージョン(2.0)では、パスフレーズは暗号化されたうえでZohoのクラウド上に保存されていました。パスフレーズが使用されるのは、多要素認証を通じたサインインに何らかの問題がある場合に、アカウントへのアクセスを復元するときです。このとき、復元用に入力されたパスフレーズは、Zohoのクラウド上に保存されているパスフレーズと照合され、一致した場合は復元が可能になっています。Zohoのクラウド上に保存されているパスフレーズは暗号化されているため、第三者が万一データを取得してもパスフレーズ自体は分からないようになっていますが、通信時に盗聴や改ざんが行われる可能性がありました。
3. データ損失の危険性がある
OneAuthアプリで認証情報のバックアップ/同期が行われる際、OneAuthアプリとZohoのクラウド(サーバー)の間で、認証情報が同じ状態に保たれるように処理が行われます。具体的には、認証情報(アカウント情報)の追加、更新、削除などによる変更内容が、すべて反映されるように処理が行われます。この処理において、旧バージョン(2.0)では、端末(デバイス)側で何か変更が行われた場合、Zohoのクラウド上の認証情報がいったんすべて削除され、その後あらためてデバイスからすべての情報が再追加されていました。この方法では、変更対象となっていないデータも含めて削除や追加の処理が行われるため、データ損失につながる危険性がより高くなっていました。
これらの問題点に対処するため、新バージョン(3.0)では、以下のような改善が行われました。
OneAuthアプリの新バージョン(3.0)での改善点
上記の問題点に対処するため、OneAuthアプリの新バージョン(3.0)では以下の改善が行われました。
1. 新しい暗号化方式(AES-GCM)への変更
OneAuthの新バージョン(3.0)では、ワンタイムパスワード生成用の認証情報(シークレット)を暗号化する際の方式として、AES-GCMと呼ばれる方式が使用されます。この方式では、元のデータが複数のブロックに分割されることは旧バージョンの方式(AES-ECB)と同じですが、ブロックごとに暗号化された後のデータがすべて異なるように処理されます(元のブロックのデータが同じでも暗号化後のブロックのデータは異なります)。これにより、暗号化されたデータが仮に傍聴されても、元のデータ全体のパターンや内容を推測するのが難しくなります。これにより、安全性がより高まります。
2. パスフレーズの送信の回避(ゼロ知識証明)
OneAuthの旧バージョン(2.0)における復元の手続きでは、OneAuthがインストールされた端末(デバイス)とZohoのクラウド間で、パスフレーズをやりとりする必要がありました。新バージョン(3.0)では、パスフレーズそのものはやりとりされません。まず、端末側で、パスフレーズに対して一定の処理(PBKDF2と呼ばれる関数による処理)を加えた値(キー)が生成されます。この値は端末側のみに保存されます。その後、この値をもとに認証情報が暗号化され、復号時にも使用されます。これにより、復元時に端末とZohoのクラウドの間でパスフレーズをやりとりする必要がなくなり、安全性が高まります(Zohoのクラウド上にパスフレーズの情報は保存されません)。
3. 変更内容のみの同期
端末(デバイス)側で認証情報(アカウント情報)に関して何か変更が行われた際に、それに応じた分の変更(差分)のみが、クラウド上の情報に同期されるようになりました。これにより、新バージョン(3.0)では、必要な分の変更のみが反映されます。変更に関係ない情報の削除や再追加は行われません。これにより、データ損失の危険性が下がります。
暗号化と復号(暗号化の解除)の流れ
バックアップ時
OneAuthアプリにおいてバックアップの設定を初めて行う際、パスフレーズをまず設定する必要があります。設定したパスフレーズを用いて、ワンタイムパスワード生成用の認証情報(シークレット)が暗号化され、Zohoのクラウドに保存されます。
その後、以下のような流れに従って暗号化の処理が行われます。
- 暗号化の強度を高めるための文字列(ソルト)を2種類生成します。1つは、認証情報(シークレット)の暗号化用キーの生成に使用します。もう1つは、復元用キーの生成に使用します。
- 手順1で生成した2種類の文字列(ソルト)を、Zohoのクラウドに保存します。
- パスフレーズと復元用文字列(ソルト)をもとに、PBKDF2関数を通じてキーを生成します。このキーは、復元用のキーとして使用します。
- パスフレーズと暗号化用文字列(ソルト)をもとに、PBKDF2関数を通じてさらに別のキーを生成します。このキーは、暗号化用のキーとして使用します。
- 復元用キーを用いて、ユーザーIDを暗号化します。この暗号化には、AES-GCMの方式が用いられます(ユーザーIDは、Zohoユーザーごとに専用の値で、ユーザー情報の識別に用いられます)。
- 暗号化されたユーザーIDをZohoのクラウドに保存します。保存された情報は、認証情報やアカウントの復元時に使用します。
- 暗号化用キーを用いて、ワンタイムパスワード生成用の認証情報(シークレット)を暗号化します。この暗号化には、AES-GCMの方式が用いられます。
- 暗号化された認証情報(シークレット)をZohoのクラウドに保存します。
認証情報(シークレット)の復元時
新しい端末(デバイス)において、ワンタイムパスワード生成用の認証情報(シークレット)を復元する際、パスフレーズの入力が求められます。入力されたパスフレーズを用いて、認証情報の暗号化が解除(復号)されます。
その後、以下のような流れに従って復元の処理が行われます。
- 端末(デバイス)において、復元用文字列(ソルト)をZohoのクラウドから取得します。
- パスフレーズと復元用文字列(ソルト)をもとに、PBKDF2関数を通じてキーを生成します。このキーは、復元用のキーとして生成していたものと同一のものです。
- 暗号化されたユーザーIDを表す値を、Zohoのクラウドから取得します。
- 復元用のキーを用いて、ユーザー情報の暗号化を解除(復号)します。パスフレーズが正しく入力されていた場合で上記の処理が適切に完了すると、次の手順に進みます。適切に完了しなかった場合、パスフレーズが正しくないことを示すエラーが表示されます。この場合、パスフレーズを正しく入力しなおす必要があります。
- パスフレーズと暗号化用文字列(ソルト)をもとに、PBKDF2関数を通じてさらに別のキーを生成します。このキーは、暗号化用のキーとして生成していたものと同一のものです。
- 暗号化された認証情報(シークレット)を表す値を、Zohoのクラウドから取得します。
- 暗号化用のキーを用いて、取得した認証情報の暗号化を解除(復号)します。
- 端末(デバイス)において、認証情報(シークレット)が復元されます。