問題タブ [one-time-password]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
security - CBC と ECB に同じ AES キーを使用する
概要
サーバーとクライアントが、クライアントごとに異なり、しかも決定論的なリクエストごとに一意の IV を生成できるようにする方法を考え出そうとしています。決定論的とは、サーバーが開始シーケンスのみを知っている将来のリクエストの IV を計算できることを意味します。
この機能が必要な理由は、AES 暗号化を使用してワンタイム パスワード (OTP) スキームを実装しているためです。クライアントがサーバーにログインすると、シードが与えられます。最初の OTP は、このシードを暗号化することによって生成されます。後続の各リクエストに対して、クライアントはサーバーとクライアントの間で共有された AES キーを使用して最後の OTP を暗号化します。したがって、攻撃者が共有キーなしで最後の OTP を傍受したとしても、次の OTP を取得することはできません。OTP は CBC モードの AES で暗号化されています。サーバーとクライアントが同期していない場合に問題が発生します。これに対処するために私が計画していた方法は、サーバー側で将来に向けていくつかの OTP を生成し、それらのいずれかがクライアントのものと一致するかどうかを確認することでした。でも、
提案するソリューションに入る前に、AES、IV、CBC、および ECB についての私の理解を表明させてください。そうすれば、私の基礎に誤解があれば、指摘して修正することができます。
仮説
ECB
ECB は、同じキーで暗号化されたプレーンテキストの同一のブロックに対して同じ出力を生成することを知っています。したがって、データを統計的に分析することで平文に関する情報を識別できるため、複数のデータ ブロックに使用しないでください。これに基づいて、データが常に 16 バイト (128 ビット) 未満であることを保証できれば、統計的攻撃の問題が解消されるように思われます。さらに、同じ平文を同じ鍵で暗号化していないことを保証できる場合、同じ出力が得られることはありません。したがって、システムが常にこれらの非常に厳しい基準を満たしていると仮定すると、ECB を使用することは安全であると思われます。
CBCおよびIV
私は、CBC がこれらの問題の両方を排除することを意図していることを知っています。ブロックを連鎖させることで、ECB のマルチブロック統計攻撃を排除します。同じ AES キーに同じ IV を使用しないことで、同じ平文を同じキーで同じ出力に暗号化するという問題を解消できます。
キーの一意性
各クライアントが生成された AES キーを取得した場合、複数のユーザーが同じキーを持っている可能性はわずかですが、可能性は非常に低くなります。したがって、2 つのクライアントが同じ AES キーを使用することはないと想定しても安全です。
提案されたソリューション
私が提案する解決策は、各クライアントに一意の AES キーを与えることです。キーが生成されると、カウンターが乱数に初期化されます。何かを暗号化する必要があるたびに、カウンターは 1 ずつ増加します。この番号はブロックにパディングされ、ECB モードで AES を使用して暗号化されます。これの出力は、CBC を使用してデータを暗号化するための私の IV になります。
サーバーが同じキーを持ち、ECB が IV を必要としないためにクライアントのカウンターと同期しなくなった場合、データを復号化できるものが見つかるまで IV を生成し続けることができます。
私の考えでは、この IV は AES のブロック サイズに等しいため、統計的攻撃から安全です。さらに、各ユーザーは一意のキーを持ち、カウンターは常に増加するため、毎回ユーザーごとに異なります。明らかに、AES キーは安全に送信する必要があります (現在、クライアントは生成されたキーをサーバーの公開 RSA キーで暗号化しています)。
私の質問
提案されたソリューションで説明されているテクノロジに関する基本的な理解は正しいですか? 提案されたソリューションに明らかに問題がありますか? 提案された方法で IV を生成し、CBC を使用して暗号化するために同じキーを使用するセキュリティ上の欠陥はありますか?
暗号化は非常に難しいため、最後の質問は答えるのが難しい/不可能である可能性があることを認識していますが、洞察をいただければ幸いです。
前もって感謝します。
java - Java バイト配列操作
バイト配列の最後のバイトの下位 4 ビットを選択しようとしています。これは以前にPHPで行った方法ですが、Javaは初めてです。
誰かがJavaで正しい方向に私を向けることができますか?
python - Python での Google 認証システムの実装
Google Authenticator アプリケーションを使用して生成できるワンタイム パスワードを使用しようとしています。
Google 認証システムの機能
基本的に、Google Authenticator は 2 種類のパスワードを実装しています。
- HOTP - HMAC ベースのワンタイム パスワード。RFC4226に準拠して、呼び出しごとにパスワードが変更されることを意味します。
- TOTP - 時間ベースのワンタイム パスワード。30 秒ごとに変更されます (私の知る限り)。
Google Authenticator は、 code.google.com /p/google-authenticatorからオープン ソースとしても利用できます。
現在のコード
HOTP および TOTP パスワードを生成する既存のソリューションを探していましたが、あまり見つかりませんでした。私が持っているコードは、HOTP の生成を担当する次のスニペットです。
私が直面している問題は、上記のコードを使用して生成したパスワードが、Android 用の Google Authenticator アプリを使用して生成したものと同じではないことです。GAアプリ内で提供されたキーと等しい複数のintervals_no
値(正確に最初の10000、で始まるintervals_no = 0
)を試しましたが。secret
私が持っている質問
私の質問は次のとおりです。
- 私は何を間違っていますか?
- Python で HOTP や TOTP を生成するにはどうすればよいですか?
- このための既存の Python ライブラリはありますか?
要約すると、Python コード内に Google Authenticator 認証を実装するのに役立つ手がかりがあれば教えてください。
algorithm - ワンタイムパスワードアルゴリズム(材料ベース、時間ベース、アクションベースの両方)
Webサイトとそれに対応するヘルパープログラム(ユーザーのコンピューターにインストールされている)を開発しようとしています。Webサイトとプログラムは相互に通信しますが(ほとんどの場合AJAX)、他のWebページがプログラムに要求を送信できる場合はセキュリティ上の大きなリスクになります。私のプログラム(ユーザーのコンピューターにインストールされている)に不正要求を注入することを非常に困難にする解決策を考え出したいです。私の考えではワンタイムパスワードを使用しようとしていますが、セキュリティに関する知識が限られているため、ご意見をお聞かせください。
私はこのワンタイムパスワードアルゴリズム(疑似)を思いついた:
次のプロパティが必要です。
- 一度だけ使用できます(すべてのOTP世代で「カウンター」が増加します=>新しいシード)
- 毎分変更されます(時間によって異なります)。
- アクション(ログイン、...)にバインドされ、特定のアクションによって異なります。
- 個別に簡単に生成し、後で同期することができます。
すべてのリクエストにOTPコードとカウンター値が含まれている場合、これは安全ですか?そうでない場合、これを達成するためのヒントは何ですか?上記のすべてのプロパティが本当に必要です。
前もって感謝します。
java - OTP(ワンタイムパスワード)で接続するためのWebサービス
投稿のタイトルに記載されているように、ユーザーがOTPに接続できるようにするWebサービスの設計で構成されるプロジェクトがあります。インターネットを実際に検索したところ、SMSを送信するためのJava API(SMSLib)があることがわかりましたが、サーバー側でのOTPの生成と、実行する必要のあるWebサービスを介した送信に関しては見つかりませんでした。なんでも。この問題について話しているチュートリアルをいくつか見せて、私を助けてくれませんか。
前もって感謝します
bash - スクリプトからotpを使用してsshを呼び出す
私の会社では、OTP over ssh(ワンタイムパスワード)を使用して本番マシンにアクセスしています。相互作用は次のようになります。
この時点で、Javaプログラムを実行して、SSHから取得した情報を使用してOTP応答を生成します。 注: ssh出力(この例では「942st9621」)からのハッシュは、入力として以下のコマンドに渡される必要があることに注意してください。このハッシュは、sshを実行するたびに変更されます。
次に、生成されたOTP( "LAD DARN BHOY TEST ACHE JUTE")を切り取って、他のコンソールウィンドウに貼り付けます。
したがって、すべてを明確にするために、sshコマンドから生成されたデータをパスワードと組み合わせてjopを実行するときに使用する必要があります。その後、結果はまだ実行中のsshコマンドに返されます。
このプロセスを自動化したいと思います。基本的に、ホスト名を取得し、パスワードを要求し、sshを呼び出し、otp-md5コードをjopに渡し、OTPをsshに戻すbashスクリプトを用意します。パスワードをコマンドライン引数として入力する必要がないのは便利です。これはコマンド履歴に保存されるため、セキュリティ上の大きな問題です。
これは可能ですか?
ありがとうございました
one-time-password - モバイルとサーバー間の通信を暗号化するためにワンタイム パスワードを使用できますか?
アプリがクライアントと通信するために SSL が受け入れられない場合、トラフィックをどのように暗号化すればよいですか? 速いものが必要です (公開鍵アルゴリズムは論外です)。ワンタイムパスワードを考えていたのですが、アプリのサイズ制限でモバイルアプリに非常に長いキーを保存できないのが難点です。あなたは何をお勧めします?
authentication - コンピューターに Web アプリケーションへのアクセスを許可する
私は Web アプリケーションを持っており、Google が Google アカウントに追加したものと同様に、セキュリティを強化するために安全なサインオンを追加する任務を負っています。
使用事例
基本的に、ユーザーがログインするときに、ユーザーが以前にこのコンピューターを承認したかどうかを検出する必要があります。コンピュータが認証されていない場合、ユーザーはワンタイム パスワードを (電子メール、SMS、または電話で) 送信され、入力する必要があります。ユーザーは、このコンピュータを記憶することを選択できます。Web アプリケーションでは、許可されたデバイスを追跡し、ユーザーがそのデバイスから最後にいつ/どこでログインしたかを確認し、必要に応じてデバイスの許可を解除します。
非常に軽いタッチ (つまり、クライアント側のソフトウェアのインストールを必要としない) で、Safari、Chrome、Firefox、および IE 7+ (残念ながら) で動作するソリューションが必要です。十分なセキュリティを提供する x509 セキュリティを提供しますが、x509 を使用できない、または使用しない顧客向けのソリューションが必要です。
私の意図は、Cookie を使用して認証情報を保存することです (または、ローカル ストレージを使用して、フラッシュ Cookie に分解し、次に通常の Cookie を使用する可能性があります)。
最初の赤面
2 つの個別の値 (ローカル データまたは Cookie) を追跡します: 安全なサインオン トークンとデバイス トークンを表すハッシュ。どちらの値も Web アプリケーションによって駆動 (および記録) され、クライアントに指示されます。SSO トークンは、デバイスとシーケンス番号に依存します。これにより、デバイスの認証を効果的に解除し (すべての SSO トークンが無効になります)、シーケンス番号を使用してリプレイを軽減し (効果的ではないため、この質問をしているのです)、ナンスを使用します。
問題
このソリューションでは、だれかが SSO とデバイス トークンをコピーして、別の要求で使用することができます。シーケンス番号は、このような悪用を検出してデバイスの認証を解除するのに役立ちますが、検出と応答は、有効なデバイスと悪意のある要求の両方がアクセスを試みた後にのみ発生します。これは、損害が発生するのに十分な時間です.
HMACを使ったほうがいいような気がします。デバイス、シーケンスを追跡し、ノンス、タイムスタンプ、秘密鍵を使用してハッシュを作成し、ハッシュとそれらの値をプレーン テキストとして送信します。サーバーは (デバイスとシーケンスの検証に加えて) 同じことを行い、比較します。秘密鍵を安全にネゴシエート、交換、および保存できると仮定すると、それははるかに簡単で、はるかに信頼性が高いように思えます。
質問
では、許可されたデバイスの秘密鍵を安全にネゴシエートし、その鍵を安全に保管するにはどうすればよいでしょうか? 少なくとも、ローカル ストレージまたはフラッシュ Cookie を使用して秘密鍵を保存することに同意し、それで十分だと言うことは可能ですか? または、私が説明している脆弱性を軽減するために、元のドラフトにできることはありますか?
c# - C#のワンタイムパスワードは一定期間後に期限切れになりますか?
私は現在 C#.net で Web サイトのログイン ページに取り組んでおり、問題が発生しました。皆さんが私を助けてくれることを望んでいました。
これはケースです: ユーザーはログイン画面に来て、そこから電子メールを入力します。データベースを参照して有効性をチェックします。有効な場合は、ランダムな 8 桁のキーが返されます。生成され、電子メールに送信されます。ユーザーは、メールをチェックして「ワンタイム パスワード」を取得し、1 つのテキスト ボックスにキーを入力して続行する必要があります。
生成とメール送信は完了しましたが、これを続ける方法がわかりません
私のチーム メンバーの間でいくつかの議論があり、そのうちの 1 人がセッション タイムアウトの使用を提案しました。ボタンがクリックされると、メールが送信され、セッション変数が作成され、ワンタイム パスワードが保存されます。ユーザーがセッション変数で入力したテキストボックスのテキストを参照し、それが正しければログインします。
私が考えていた別の方法は、Javascript タイマーを使用してから、Web ページ上の非表示のラベルを参照することです。しかし、Javascriptがそれを可能にするかどうかはわかりません..
この状況に対する最善のアプローチは何ですか?
ありがとう!