selenium・pythonを使ってAmazonの領収書を自動取得する方法〜シリーズ4(番外編):OTPについての理解を深める〜

Python
この記事は約9分で読めます。

さて、今回はこのシリーズ第1回で予告していた、2要素認証をパスするために利用した、OTPを作成するoath-toolkitとsubprocessの理解を深めるための記事です。

OTP(ワンタイムパスワード)ってよく使いませんか?金融機関の払込で利用するトークン(小型のOTP精製機)やgithubログイン・Herokuログイン・Googleログインなどに利用するAuthenticatorなどもそうですよね。

今回はちょっとノンプロで利用するってわけではないですが、今流行りの基礎技術であるTOTP(OTP作成のための方法)を中心に、oath-toolkitというローカルでTOTPなどの生成を手助けしてくれるツールの説明などをしていきます。

まだ第1回の記事を読まれていない方は以下の記事をご覧ください。

では、早速いってみましょう。

スポンサーリンク

2要素認証をパスするためのoathtool・subprocess(pythonモジュール)の理解のための手順

さて、まずは第1回でもお示しした理解のための手順をみていきましょう。

2要素認証をパスするためのoathtool・subprocess(pythonモジュール)の理解のための手順
  • step1
    2FAで利用されるOTPの基本を理解する

    ・OTPを作成するためのTOTP( Time-based One-Time Password )の概要理解

    ・TOTPを利用した身近なツール

    ・OTPをTOTPベースで作成するための方法

    (参考)OATH規格(initiative for Open AuTHentication)について。TOTPの共通規格

  • step2
    oath-toolkitを理解する

    ・oath-toolkitでできること

    ・base32である理由

  • step3
    terminalでoath-toolkitを使ってみる

    ・実際にterminalで試してみよう

  • step4
    subprocessモジュールの理解

    ・subprocessモジュールでできること

順々にみていって、理解を深めていきましょう。

step1: 2FAで利用されるOTPの基本を理解する

まずは2要素認証で利用されるOTP(ワンタイムパスワード)の基本をみていきましょう。ワンタイムパスワードがそもそもわからないという方は、とりあえずググってからきてください。

OTPを作成するためのTOTP( Time-based One-Time Password )の概要理解

まずは、TOTP(Time-based One-Time Password)という概念について理解していきましょう。

TOTPとは?

サーバーとクライアントで共有する秘密鍵と現在時刻から、確認コードを計算するアルゴリズム

秘密鍵を使ったアルゴリズムで、今の時間からコードを生成している、ということですね。やってることはこんなイメージです。

言葉にすれば、クライアント・サーバそれぞれがUNIX timeベースで秘密鍵を利用してTOTP(6桁の数値)を作成して、クライアント側から計算結果をサーバに送り、サーバ側で計算した結果と一致すれば認証されるというものです。

この概念はRFC6238に規定されています。原文大好きな方はこちらをご覧ください。

RFC 6238 - TOTP: Time-Based One-Time Password Algorithm

TOTPを利用した身近なツール

TOTPベースで認証を行っているツールは実はあなたの身近にも多く存在します。

TOTPを利用した身近なツール
  • 金融機関のOTPトークン
  • Google Authenticatorアプリ
  • AWS MFA

一番よく使うのはAuthenticatorですかね?金融機関のOTPトークンも振り込み処理をなされる方はよく利用されるかと思います。

OTPはグローバルでよく利用されており、なぜか日本で多いSMS認証とかよりも一般的だと思います(SIM複数使いしてる人にとってSMS認証って結構億劫なので。。)SIMフリーが普及しきっていない日本だからSMS認証が多いきもしますが、トレンド的にはOTPだと思います。

OTPをTOTPベースで作成するための方法

さて、TOTPが何をしているのかは先ほどみてきました。ということは自分自身でもUNIXタイムと秘密鍵さえ準備できて、アルゴリズムがわかれば実装できるはずです!

どんなアルゴリズムかRFCに記載があるのでみてみましょう。

K:共有秘密鍵

T0:T0は数えはじめの時間で、通常はUnix epoch、すなわち0ですね

X:Xは一周期の秒数で、規定値は30秒(大体みんな30秒を利用してます、Authenticatorも30秒ですよね)

さぁ実装しましょう・・・・って、そんなことをするのがノンプロの役割ではありません汗

利用できるツールを紹介しますので、アルゴリズム自体はそちらのツールにお任せしましょうw

OTP(TOTPベース)を作成するための支援Tool

それでは、OTP(TOTPベース)を作成するために利用できるモジュール・ライブラリなどを紹介していきます。私が知っている限りというピックアップなので、これ以外にもツールは存在すると思います。

  • oath-toolkit
  • google Authenticator API
  • pyotp(pythonライブラリ)

oath-toolkitはhomebrewなどターミナルベースで実行するもの(brewでinstall)でありますが、google authenticatorはgithubに、pyotpはpypiにあります。

google/google-authenticator
Open source version of Google Authenticator (except the Android app) - google/google-authenticator

pyotp
Python One Time Password Library

今回はoath-toolkitを利用していきますので、他のツールを試してみたい方は、自分でライブラリ等から引っ張ってやってみてください。

step2: oath-toolkitを理解する

では、早速oath-toolkitを使ってできることをざっくりと把握していきましょう。

oath-toolkitのintroductionに以下のようにできることが書かれています。

The OATH Toolkit provide components for building one-time password authentication systems. It contains shared libraries, command line tools and a PAM module. Supported technologies include the event-based HOTP algorithm (RFC4226) and the time-based TOTP algorithm (RFC6238). OATH stands for Open AuTHentication, which is the organization that specify the algorithms. For managing secret key files, the Portable Symmetric Key Container (PSKC) format described in RFC6030 is supported.

The components included in the package is:

・liboath: A shared and static C library for OATH handling.

oathtool: A command line tool for generating and validating OTPs.

・pam_oath: A PAM module for pluggable login authentication for OATH.

・libpskc: A shared and static C library for PSKC handling.

・pskctool: A command line tool for manipulating PSKC data.

https://www.nongnu.org/oath-toolkit/index.html

要約すると青ラインの部分が使える機能のメインで、HOTPとTOTPというOTPを作成するためのメジャーなアルゴリズム2種をサポートしています。

TOTPは先ほど、TOTPの概要理解で説明させていただきましたが、OTP対応するための手法としてもう一つHOTP(HMAC-based One-Time Password)というアルゴリズムを採用する場合もあります(この頃減ってるイメージですが)。

HOTPの簡易説明

一応簡易的ではありますが、HOTPについても少し説明を入れていきます。

HOTPは、カウンタベースのOTPと言われており、シードとハッシュ関数を利用してOTPを作成する手法のようです(私も実際使うケースがないので、あまりしっかり理解していません。。)

カウンタベースということで、利用するたびにOTPが変わる(TOTPは時間別でOTPが変わる)ため、基本的には1度使ったOTPは2度と再現されないはずです。他方で、クライアントとサーバ側でカウント数がずれると補正が必要になるため、あんまり使われていないと昔読んだ記憶があります。

TOTPの計算ロジックをみてもらうとわかりますが、HOTPはTOTPの計算ロジックにも含まれています。

step3: terminalでoath-toolkitを使ってみる

では、早速terminalでoath-toolkitを使ってみましょう。まずはinstallからです。

brew install oath-toolkit

インストールできたら、実際にOTPを作っていきましょう。やることは、第1回でsubprocessでやったことと同じです。

oathtool --totp --base32  "32桁のキー"

実行すると以下のようにTOP(6桁の数値)が返されます。

これは、実はやっていることは、第1回のpython subprocess経由で実行しているコマンドと同様です。まぁもちろんそうですよね、subprocessってそういうモジュールなので。

まとめ

今回は、【selenium・pythonを使ってAmazonの領収書を自動取得する方法〜シリーズ4(番外編):OTPについての理解を深める〜】ということで、OTPの元となるTOTPとは何か、そしてTOTPベースでOTPを作成するためのライブラリや、oathtoolkitの使い方のサンプルなどを説明してきました。

ノンプロ的なトピックではないですが、いろいろな技術の裏側を少しずつ知っておくと楽しいものですよ(私も少ししか知りませんが。。)

関連記事: seleniumでAmazon領収書をPDF保存する方法関連記事

確定申告の時期にいつも必要になる領収書。そしてよく使うAmazon。そんなAmazonの領収書を一つ一つクリックして保存するなんて、時間的にも精神的にも辛い。というわけで、Amazonの領収書をseleniumを使って自動で指定フォルダにPDF保存する方法の紹介をするシリーズです。

  1. シリーズ1:2要素認証をパスする方法
  2. シリーズ2:2020年を選択して領収書PDFを保存
  3. シリーズ3:コード解説(kioskオプション,保存ディレクトリの指定, actionChains)
  4. シリーズ4(番外編):OTPについての理解を深める

コメント

タイトルとURLをコピーしました