Qypherは、なぜ安全なのか。
技術者の方へ。Qypherがどのように安全性を担保しているかを、設計の考え方という観点から説明します。
はじめに:このページであえて書かないこと。
このページでは、Qypherの安全性を「どんな性質・原則で守られているか」という形で説明します。一方で、鍵の長さ、アルゴリズムの正確な組み合わせ、内部のデータ構造といった実装の細部は、あえて書きません。それらは公開しても攻撃者の手がかりになるだけで、安全性を理解してもらうのに必要ないからです。Qypherの安全性は、設計をひた隠しにすることで成り立っているのではなく、ここに挙げる性質そのものによって支えられています。
1. パスワードを使わない設計
認証情報は、人間が記憶するパスワードではなく機械生成のトークンです。使い回し・推測・記憶した秘密のフィッシングといった、パスワード固有のリスクがそもそも発生しません。
2. 生の資格情報は保存しない(一方向ハッシュのみ)
Qypherのデータベースには、認証情報を元に戻せる形では保存していません。保存しているのは、元の値を計算で復元できない一方向ハッシュ(変換後の値)だけです。そのため、万一データベースが流出しても、そのまま使える認証情報を取り出すことはできません。また、氏名・住所などの個人情報も、認証情報とは別にすべて暗号化して保存しているため、万一流出しても中身をそのまま読み取られることはありません。
3. 暗号学的に安全な乱数で生成
資格情報は暗号論的に安全な擬似乱数生成器(CSPRNG)で生成します。時刻のような予測可能な入力には依存しないため、列挙や推測による生成・再現ができません。
4. トークンは認証付き暗号で保護(改ざん・偽造を検知)
QRに含まれるトークンは、暗号化に加えて完全性保護が施されています。改ざんされた、あるいは偽造されたトークンは検証段階で確実に拒否されます。部分的な情報から有効なトークンを組み立てることはできません。
5. 認証情報は「分割できない一体」として検証
複数の要素をまとめて1つの単位として検証します。一部だけを知っていても認証は通らず、要素ごとに個別に攻撃する余地を与えません。
6. ログイン結果は「行き先」とセットで検証(横取り・なりすまし対策)
ログインの結果には「どのサイト宛てか」という行き先の情報が一緒に入っていて、あとから書き換えられないように封がされています。受け取ったサイトは、その封が本物かどうかを確かめてから受け入れます。そのため、攻撃者が途中で結果を横取りして、別の(偽の)サイトで使い回すことができません。
7. データ提供はユーザーの同意が起点(ユーザーが主導権を持つ)
各サイトに既定で渡るのは Qypher IDと、年齢の確認結果(はい/いいえ) という必要最小限だけです。実年齢や生年月日そのものは渡さず、そのサイトが定めた年齢条件を満たすかだけを伝えます(年齢確認が必要な場面で「送信を拒否されて確認できない」状況を防ぐため、確認結果を既定に含めています)。それ以外のデータを渡すかどうかは、サイトからの要求と、それに対するユーザーの許可の両方がそろって初めて決まり、ユーザーが許可していないデータが渡ることはありません。各サイトが求めるデータと規約はログイン時に提示され、ユーザーは内容を確認したうえで同意できます。
※ ただし、いったん渡されたデータをサイト側がどう取り扱うかは各サイトの責任範囲であり、Qypherがそこまで保証するものではありません。
8. 即時失効(再発行で過去のQypherカードを無効化)
Qypherカードを再発行すると、それまでのカードはその瞬間に無効になります。紛失したときや、何か様子がおかしいと感じたときは、ユーザー自身がいつでもカードを作り直して、それまでの資格情報を無効にできます。万一の漏洩があっても、危険にさらされる期間を最小限に抑えられます。
9. サーバーサイドセッション+無操作タイムアウト
セッションはサーバー側で検証し、クライアントには信頼の根拠となる秘密を持たせません。一定時間操作がなければ自動的に失効します。盗まれて困るものを、そもそもクライアントに置かない設計です。
10. 境界での多層防御
APIは、自動化された濫用検知・評価ベースの遮断・ボットフィルタなど、複数の層で保護されています(具体的な基準や閾値は非公開です)。
11. 年齢の判定はQypher側でまとめて行う
Qypherは、ユーザーが登録した生年月日をもとに年齢を判定しますが、各サイトへ渡すのは実年齢ではなく「そのサイトが定めた年齢条件を満たすか(はい/いいえ)」という判定結果だけです。生年月日も実年齢もQypherの中だけにとどまり、サイト側には出ません(毎回そのまま年齢を渡すと、誕生日に値が変わることから生年月日を推測される恐れがあるため、結果だけを渡します)。これにより、各サイトが生年月日や年齢そのものを集めて管理する必要がなくなります。
さらに各サイトは、自分のサービスに合わせて年齢のしきい値を独自に設定でき、そのしきい値に満たない利用者を「利用不可にする(年齢制限)」か「保護者の確認を求める」かを選べます(13歳未満には保護者確認が基本となります)。
※ これは登録された生年月日に基づく判定であり、公的書類による年齢審査ではありません。
12. 各国政府・金融機関でも採用される暗号方式を使用
独自開発の暗号ではなく、各国の政府機関や金融業界でも採用されている、世界で確立した暗号方式を用いています。長年にわたり世界中の専門家の検証を受け続けてきた、信頼性の高い方式です。通信はすべてTLSで保護されます。安全性を「設計を隠すこと」だけに頼ることはありません。
つまり、こういう事態に強い。
- データベースが漏れても:認証に使う資格情報は一方向ハッシュとしてのみ保存しているため、そのまま使える資格情報は得られません。
- Qypherカードを盗み見/コピーされても:再発行すれば旧カードは即座に無効。さらに偽造・改ざんは認証付き暗号で検知されます。
- 偽サイトに誘導されても:認証結果の宛先は検証されるため、攻撃者のサイトへ横取りできません。
- ユーザーが許可していないデータは渡らない:サイトに渡るのは「サイトの要求」と「ユーザーの許可」が重なった範囲だけで、許可していない情報が勝手に流れることはありません。
実装の詳細を公開しない理由。 それは「公開しても攻撃者の役にしか立たない情報」だからです。設計上の安全性は、上に挙げた性質によって担保しています。もし脆弱性を見つけられた場合は、それが攻撃に使われてしまう前に、まずはお問い合わせフォームからお知らせいただけますと幸いです。
Qypher = QR + Key + Cipher
安全性は、隠すことではなく、設計でつくる。