CLOVER🍀

That was when it all began.

Ubuntu Linux 22.04 LTSで、oathtoolを使ってコマンドラインでTOTPのワンタイムパスワードを生成する

これは、なにをしたくて書いたもの?

最近、oathtoolというものでTOTPのワンタイムパスワードをコマンドラインで生成できることを知ったので、少しメモして
おこうかなと。

OATH Toolkit

oathtoolは、OATH Toolkitというツールキットの一部です。

OATH Toolkit

OATH Toolkitは、OTP(ワンタイムパスワード)認証システムを構築するためのコンポーネントを提供します。

OATH Toolkit provide components to build one-time password authentication systems.

含まれるものとしては、共有Cライブラリー、コマンドラインツール、PAMモジュールがあります

It contains shared C libraries, command line tools and a PAM module.

サポートされている技術としては、HOTP(Hash-based Message Authentication Code(HMAC))アルゴリズム、
TOTP(Time-based One-time Password)アルゴリズム、秘密鍵を管理するためのPSKCが含まれます。

Supported technologies include the event-based HOTP algorithm (RFC 4226), the time-based TOTP algorithm (RFC 6238), and Portable Symmetric Key Container (PSKC, RFC 6030) to manage secret key data.

なお、OATHというのはOpen AuTHenticationというアルゴリズムを規定する組織の略だそうです。

OATH stands for Open AuTHentication, which is the organization that specify the algorithms.

OATH Toolkitに具体的に含まれるのは、以下です。

開発は、GitLabで行われているようです。

oath-toolkit / oath-toolkit · GitLab

今回は、oathtoolを使っていきます。

参考)

第508回 Ubuntuでコマンドラインからワンタイムパスワードを扱う | gihyo.jp

環境

今回の環境は、こちら。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy


$ uname -srvmpio
Linux 5.15.0-78-generic #85-Ubuntu SMP Fri Jul 7 15:25:09 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

oathtoolをインストールする

oathtoolは、aptでインストールできます。

$ sudo apt install oathtool

バージョン。

$ oathtool --version
oathtool (OATH Toolkit) 2.6.7
Copyright (C) 2009-2021 Simon Josefsson.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Simon Josefsson.

ヘルプ。

$ oathtool --help
Usage: oathtool [OPTION]... [KEY [OTP]]...
Generate and validate OATH one-time passwords.  KEY and OTP is the string '-'
to read from standard input, '@FILE' to read from indicated filename, or a hex
encoded value (not recommended on multi-user systems).

  -h, --help                    Print help and exit
  -V, --version                 Print version and exit
      --hotp                    use event-based HOTP mode  (default=on)
      --totp[=MODE]             use time-variant TOTP mode (values "SHA1",
                                  "SHA256", or "SHA512")  (default=`SHA1')
  -b, --base32                  use base32 encoding of KEY instead of hex
                                  (default=off)
  -c, --counter=COUNTER         HOTP counter value
  -s, --time-step-size=DURATION TOTP time-step duration  (default=`30s')
  -S, --start-time=TIME         when to start counting time steps for TOTP
                                  (default=`1970-01-01 00:00:00 UTC')
  -N, --now=TIME                use this time as current time for TOTP
                                  (default=`now')
  -d, --digits=DIGITS           number of digits in one-time password
  -w, --window=WIDTH            number of additional OTPs to generate or
                                  validate against
  -v, --verbose                 explain what is being done  (default=off)

Report bugs to: oath-toolkit-help@nongnu.org
oathtool home page: <https://www.nongnu.org/oath-toolkit/>
General help using GNU software: <https://www.gnu.org/gethelp/>

oathtoolの使い方

基本的には、以下の使い方になると思います。

$ oathtool --totp --base32 [シークレット]

--totpはパスワード生成にTOTPを使うオプションです。デフォルトはHOTPなので、通常は--totpを指定することになるでしょう。

--base32は、シークレットとしてBase32エンコードされた文字列を与えることを示します。

これで、ワンタイムパスワードが生成できます。

$ oathtool --totp --base32 [シークレット]
123456

その他、知っておいた方がよさそうなオプション。

デフォルトでTOTPの間隔は30秒なのですが、-sまたは--time-step-sizeで間隔を指定できます。

$ oathtool --totp --time-step-size=60s --base32 [シークレット]
123456

-wまたは--windowで、追加でパスワードを生成する数を指定できます。たとえば、-w 2を指定すると3つパスワードが得られます。

$ oathtool --totp -w 2 --base32 [シークレット]
123456
234567
345678

連続した2つのパスワードが欲しい、という場合は-w 1を指定するとよいでしょう。

$ oathtool --totp -w 1 --base32 [シークレット]
123456
234567

ちなみにこの追加分のパスワードは、-sまたは--time-step-sizeで指定した間隔(デフォルトは30秒)で生成します。

便利そうなので、覚えておこうかなと思います。