tsurutanのつぶやき

備忘録としてつぶやきます

二段階認証 実装方法 -Ruby

f:id:tsurutan:20150516112512j:plain ここではRubyを使って二段階認証の実装方法を説明したいと思います。

二段階認証とは

一般的に一つのパスワードでいろいろなサービスを利用できますが、フィッシング詐欺などでパスワードが盗まれてしまうと、第三者に不正にログインされ、サービスなどが不正利用されてしまう危険があります。 2段階認証を利用することで、パスワードでの確認に加えて、ユーザーの端末に送信されるセキュリティコードでの確認が追加となります。これにより、セキュリティコードが届かない第三者による不正ログインを防止することができます。

実装方法

今回使うgemは

github.com こちらのrotpというものになります。 rotpはRuby 1.9.3以上に対応していますのでご確認ください

1.インストール

gem install rotp

2.秘密鍵の作成

secret = ROTP::Base32.random_base32

ROTP::Base32.random_base32はデフォルトでランダムな16文字を返すように指定ます。また、引数を渡すことで文字の長さを買えることができます。ex `ROTP::Base32.random_base32(20)

3.TOTPオブジェクト作成

先ほど作成したsecretを引数にわたしTOTPオブジェクトを作成します。

secret = ROTP::Base32.random_base32
totp   = ROTP::TOTP.new(secret)

なんとこれだけで二段階認証を行うひと通りの機能が使えます。

4.パスワード表示、比較

パスワードを表示するには3で作成したTOTPオブジェクトのnowメソッドを使います。

totp.now # 例:=> 492039

また、今度は入力された値がパスワードと一致しているのかを比較するためverifyメソッドを使います。

totp.verify(492039) # => true
totp.verify(492039) # => false

これだけでパスワードの表示、比較ができます。簡単ですね!

QRコードの作成

次にQRコードを表示してみましょう。QRコードを表示するためにはまずTOTPオブジェクトのprovisioning_uriメソッドをつかいURIを作成します。

uri    = totp.provisioning_uri("tsurutan.com")

その後RQRCodeを使いQrコードに変換しましょう

qr     = RQRCode::QRCode.new(uri, size: 12)
png    = qr.to_img

これでQRコードをイメージファイルとして作成することができました。

f:id:tsurutan:20150516120701p:plain

お持ちのスマートフォンGoogle Authenticatorをインストールして画像を読み込んでみましょう!

所感

いかがでしたでしょうか。二段階認証って硬いイメージがありますが実装するのはとても簡単ですよね。でも、こんなに簡単すぎて不安だという方もいらっしゃると思いますが、rotpはワンタイムパスワードの仕組みに則って作成されているので安心して大丈夫だと思います。

ワンタイムパスワード - Wikipedia