toshirot / mychat

chat on Elysia
MIT License
0 stars 0 forks source link

TOTP(Time-based One-Time Password)について #9

Open toshirot opened 6 months ago

toshirot commented 6 months ago

ここでは、TOTP(Time-based One-Time Password)を検討します

Time-based One-time Password Wiki

Time-based One-time Password(タイムベースドワンタイムパスワード、: TOTP)は、認証技術であり、時間に基づいて生成されるワンタイムパスワード(一度限りのパスワード)である。RFC6238で「TOTP: Time-Based One-Time Password Algorithm」として定義されている[1]https://ja.wikipedia.org/wiki/Time-based_One-time_Password

RFC6238 https://ja.wikipedia.org/wiki/Request_for_Comments

時間ベースのワンタイムパスワードとは?(TOTP) https://www.keepersecurity.com/ja_JP/resources/glossary/what-is-a-time-based-one-time-password/#:~:text=%E6%99%82%E9%96%93%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%83%AF%E3%83%B3%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%20(TOTP)%20%E3%81%AF%E3%80%81%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0,%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

toshirot commented 5 months ago

Google AuthentcatorなどのTOTP問題点

ワンタイムパスワード (OTP)をchatと同じサーバー側で生成すると、サーバー側の人間に覗かれる可能性がある。

それは、SMSでも同様。

ここは割り切り事項とするか別の方法があるか?

toshirot commented 5 months ago

一般的にセッションはサーバー側で維持されるから相手を特定可能ではある。 セッションレスで、かつユーザー情報を秘匿してログイン状態を維持できるか?

匿名認証

匿名認証とは、ユーザー名・パスワードを入力せずに〇〇〇の会員登録を実施するものです。 いちどログアウトしたあとで再び匿名認証を実施すると別ユーザーとして登録されてしまうため、アプリを使い始めてもらうまでの仮ユーザーとして利用するといった用途があります。

まぁ使い捨てなら良いのかな

toshirot commented 5 months ago

匿名認証 サーバーが一時的な識別子を生成 ユーザーがログインするときに、個々の識別情報や個人を特定する情報を一切提供せずに、一時的な識別子を生成します。この識別子はセッションに関連付けられ、サーバーはこの識別子を使用してユーザーを識別します。これにより、サーバーはユーザーの個々の情報を保持せずに、ログイン状態を維持できます。

匿名トークン サーバーが一意の匿名トークンを生成 ユーザーがログインすると、サーバーはユーザーに対して一意の匿名トークンを生成し、そのトークンをクライアントに返します。このトークンはユーザーを識別するために使用されますが、その内部情報はサーバーに秘匿されます。トークンの有効期限が切れた場合や、ユーザーがログアウトした場合には、トークンは無効化されます。

Pseudonymous identifiers(疑似匿名識別子) ユーザーが疑似匿名識別子を生成しサーバーへ送る ユーザーがサーバーに接続する際に、疑似匿名識別子を生成し、サーバーに送信します。この識別子はユーザーを一意に識別しますが、個々のユーザーの個人情報と直接的に関連付けられることはありません。サーバーはこの識別子を使用してユーザーを識別し、ログイン状態を維持します。

toshirot commented 5 months ago

先日、ChatGPTにアドバイスされた、Google AuthenticatorなどのTOTPやSignalプロトコルなどを検討したけど、結局のところ

end-to-end で暗号化するには、口頭含めてchatサーバーとは別の方法で秘密のフレーズを共有さえできれば良いように思える。 ログイン認証もセッションもいらない。

end-to-endで暗号化するなら、AuthenticatorもSMSもむしろ、脆弱性につながると思う。

違うだろうか?