ワンタイムパスワード前回は2つのワンタイムパスワードの生成方法について取り上げました。今回はいよいよ実際の生成アルゴリズムを取り上げましょう。TOTPをベースに説明します(ただ、前回も解説したように、基本的なロジックはTOTPとHOTPで同じです)。参考としてpythonのコードも併記してみます。タイムステップを考慮したカウンタの算出TOTPの場合、カウンタはunixtimeになります。これをそのまま使うとワンタイムパスワードが毎秒変わってしまうことになり、さすがにこれは実用的ではありません。設定し、unixtimeをタイムステップで割った値をカウンタとします。timestepこれにより、タイムステップが30なら、30秒間は同じワンタイムパスワードが生成されることになります。OATHの仕様ではタイムステップとして30秒が推奨されています。算出まず、1.で生成した値を16バイトの16進数表記に変換します(バイト数が足りない分はゼロ埋めします)。その16バイトをASCII文字列に変換したものをデータとし、パスコードをキーとしてHMACダイジェストを算出します。d:hmac_result.append(ord(c))これにより、20バイトのハッシュ文字列が生成されます。この文字列の文字コードを1文字ずつ配列に格納しておきます。ハッシュの算出にはSHA-1だけでなく、SHA-256やSHA-512なども使用できます。マスクした値をオフセットとし、そのオフセットに基づいてビット演算を行います。10のn乗(nはワンタイムパスワードの桁数となります)で割ります。その余りがワンタイムパスワードとなります。8桁の場合はこのようになります(桁数を合わせるためにゼロ埋めが必要です)。10**8)OATHの仕様には、Javaで記述されたリファレンスコードが掲載されています。生成されたワンタイムパスワードの値が正しいかどうかをテストするための値のリストも載せられていますので、独自に実装した際の確認のために使用することができます。今回説明したように、ワンタイムパスワードの生成自体はそれほど難しいものではなく(計算は少々ややこしいですが...)、スクリプト言語でも比較的簡単に実装できます。PHPやpythonなどで開発されたWebアプリケーションに組み込むことも容易ですし、スマートフォンを使ったソフトウェア・トークンもいろいろと出てきていますので、Webアプリケーションのセキュリティを高めるためにも取り組んでみるいい機会かもしれませんね。Yamazaki)プラムシステムズ株式会社所属。VPN(OpenVPN)やセキュリティ関連技術、Webアプリケーションを手がけています。いう疑問は多くの方が持たれますよね。この点は公式サイトなどにもいろいろ書かれているのですが、実際に使ってきたユーザー側としてメリットと思う部分をまとめてみました。概要を取り上げましたが、記事全体にいろいろなヒントが含まれていますので、全文の日本語訳を掲載しています。認証局を構築する現在ダウンロードできるOpenVPNでは、今まで認証局の構築で使用していたeasy-rsaが含まれなくなっています。VPNクライアントに固定IPアドレスを割り当てるOpenVPNでは、接続してきたクライアントのVPNアドレスは動的に割り振られます(その際に割り振られる際のアドレス範囲はOpenVPNサーバー側設定ファイルに基づきます)。【MacOS編】では、いよいよiPhone構成ユーティリティでVoDの設定をしてみましょう。2つのワンタイムパスワードの生成方法について取り上げました。今回はいよいよ実際の生成アルゴリズムを取り上げましょう。TOTPをベースに説明します(ただ、前回も解説したように、基本的なロジックはTOTPとHOTPで同じです)。VPNパフォーマンス対決OpenVPNはLinuxをはじめとした幅広いプラットフォームで動作実績があるのが特徴の一つです。3機種をOpenVPNサーバーとしてセットアップし、OpenVPNのVPNパフォーマンスを測定してみましょう。ワンタイムパスワードの基本的な仕組みについて説明しました。規定しているその生成ルールについて具体的に説明します。されましたので、それを記念(?)して、OpenVPNサーバーにiPhoneから接続する手順をまとめてみましょう。