Sphereとともに

scalaとかplayframeworkとか。技術ブログにしたいなと。環境は Windows7x64, mac です。たまに声優さん情報が混ざります。最近ちょっとClojure触りました。

2段階認証について

2段階認証(2 factor authentication)

2段階認証(2 factor authentication)について

https://gist.github.com/asufana/daaa0477df93a5a2870c

https://gist.github.com/asufana/daaa0477df93a5a2870c

二段階認証(TOTP)メモ http://qiita.com/xylitol45@github/items/4f8418554a6550189341

QRコードのURLについて https://github.com/google/google-authenticator/wiki/Key-Uri-Format

Deviseを使っているRailsアプリに2段階認証を導入する http://qiita.com/Kta-M/items/e155f6e35e3e8274ff1e

考慮すること

  • リカバリコード
    • リカバリコードをDBに保存する
    • リカバリコードでもログインできるようにする
      • 使用したコードは無効化する
    • 再度secret codeを作成してユーザーに提供する(?)
  • 時計のズレ
    • クライアントとサーバーで時計がずれていくことがあるので、ズレを吸収するためにどの程度ズレが生じているのかをサーバー側に保持しておく。次回以降はそこを起点とする。

ライブラリ

https://github.com/wstrange/GoogleAuth

import com.warrenstrange.googleauth.{GoogleAuthenticator, GoogleAuthenticatorQRGenerator}

/**
  * Created by fscoward on 2017/02/01.
  */
object Main {
  def main(args: Array[String]): Unit = {
    val authenticator = new GoogleAuthenticator()
    val credential = authenticator.createCredentials()

    // この URL で QR Code を作成して読み込ませる
    val url = GoogleAuthenticatorQRGenerator.getOtpAuthTotpURL("fscoward", "otp-sample", credential)
    println(s"url: $url")

    // QR Code に埋め込まれた secret key
    val secretKey = credential.getKey
    println(s"credential: ${secretKey}, verificationCode: ${credential.getVerificationCode}, scratchCodes: ${credential.getScratchCodes}")

//    val totpPassword = authenticator.getTotpPassword(secretKey)
//    println(s"totpPassword: $totpPassword")

    // QRコードで読み込ませたときの secret key
    val storedSecretKey = "JW6W56PKJJFDTRX6"
    println(s"${authenticator.getTotpPassword(storedSecretKey)}")

  }
}
  1. base32の秘密鍵を作成
  2. QRコードでクライアントに秘密鍵を渡す
  3. クライアントはGoogle Authenticatorを用いて生成
  4. サーバーもsecret keyを用いてtotppasswordを生成

Getting Started With Oauth 2.0

Getting Started With Oauth 2.0