Kody jednorazowe czyli One Time Password (OTP) służą jako dodatkowe zabezpieczenie np. konta e-mail. Do generowania kodów przeważnie używa się aplikacji na telefon typu Google Authenticator. Do wygenerowania kodu OTP jest potrzebny tajny kod w postaci ciągu znaków Base32 lub Hex.

W systemmie Linux istnieje takie narzędzie jak oathtool, jednak za każdym razem trzeba podać tajny kod, wię jest to dość uciążliwe. Dlatego do przechowywania kodów użyjemy programu pass, który potrafi szyfrować hasła za pomocą klucza PGP.

Instalacja niezbędnych programów

dnf install oathtool gnupg2 pass fzf

Jeśli posiadamy już klucz PGP możemy sprawdzić jego nazwę oraz jego ID w innym przypadku należy wygenerować klucz PGP za pomocą polecenia gpg2 --full-generate-key. Proces generowania klucza jest opisany na stronie https://sebmd.github.io/posts/generowanie-klucza-gnupg-pgp/

Sprawdźmy jakie posiadamy klucze za pomocą polecenia gpg2 --list-secret-keys

gpg2 --list-secret-keys
/home/testowy/.gnupg/pubring.kbx
--------------------------------
sec   rsa2048 2019-04-19 [SC]
      4E70814B987ECB1AC675A5BD9B76BB5DDC8ADBE0
uid    [   absolutne   ] testowy (komentarz) <testowy@example.com>
ssb   rsa2048 2019-04-19 [E]

Inicjalizacja programu pass, wymaga podania ID tajnego klucza PGP

pass init 4E70814B987ECB1AC675A5BD9B76BB5DDC8ADBE0
mkdir: utworzony katalog '/home/testowy/.password-store/'
Password store initialized for 4E70814B987ECB1AC675A5BD9B76BB5DDC8ADBE0

Jak widać dane będą przechowywane w katalogu ~/.password-store/

Dodanie konta do pass najlepiej poprzedzić jakimś wyrazem np. otp spowoduje to, że tajne klucze będą przechowywane w podkatalogu otp, dzięki czemu można będzie łatwiej je znaleźć.

Dodanie konta testowy@gmail.com

pass edit otp/testowy@gmail.com

Wyświetlenie hasła dla konta testowy@gmail.com

pass otp/testowy@gmail.com
RWNLFJJNKP2B2VS4

Wygenerowanie kodu jednorazowego dla tajnego klucza RWNLFJJNKP2B2VS4.

oathtool --base32 RWNLFJJNKP2B2VS4 --totp
091421

Teraz złóżmy to wszystko razem:

oathtool --base32 --totp "$(pass "otp/$(find ~/.password-store/otp/* -exec basename {} .gpg \; | fzf)")"

Żeby było jeszcze łatwiej proponuję stworzyć aliasy otp i otp-add w pliku ~/.bashrc

alias otp='oathtool --base32 --totp "$(pass "otp/$(find ~/.password-store/otp/* -exec basename {} .gpg \; | fzf)")"'

Dla aliasu otp-add stworzymy funkcję o tej samej nazwie, dodatkową zaletą funkcji jest to, że jeśli podamy nazwę konta ze spacjami to zostaną one zastąpione znakiem -.

function otp-add() {
    if [ -z $1 ]; then
        echo
        echo Podaj nazwę konta.
        echo
    else
        nazwa=$(echo "$@" | tr ' ' '-')
        pass edit otp/$nazwa
    fi
}
alias otp-add=otp-add

W skrócie działa to tak:


wstecz

Date: 2020-10-24T19:53:23+02:00