アクセストークンは暗号化して保存しよう (openssl)

アクセストークンなどのシークレットキーを平文でテキストファイルに保存しておくのがちょっと心配だったので、
opensslコマンドで暗号化と復号化が出来る事を覚えた!

opensslコマンドは、
最初からインストールされてるっぽいので
簡単に使う事ができるぞ!!

openssl コマンドの使い方

基本的には openssl enc [Options] という感じで使う。

openssl enc コマンドのオプションヘルプ

openssl enc コマンドで使えるオプションは下記の通り。

-in -out で、入力ファイル、出力ファイルを指定して

-e -d で、エンクリプト(暗号化)か、デクリプト(復号化)を指定する。

--pass は、インタラクティブに入力するか、ファイル、引数などを指定できる。
何も指定しない場合は、インタラクティブに実行時に聞いてくる。

openssl aes-128-cbc みたいにすれば、encのサブコマンドは省略して書けるようだ。

options are
-in <file>     input file
-out <file>    output file
-pass <arg>    pass phrase source
-e             encrypt
-d             decrypt
-a/-base64     base64 encode/decode, depending on encryption flag
-k             passphrase is the next argument
-kfile         passphrase is the first line of the file argument
-md            the next argument is the md to use to create a key
                 from a passphrase.  One of md2, md5, sha or sha1
-K/-iv         key/iv in hex is the next argument
-[pP]          print the iv/key (then exit if -P)
-bufsize <n>   buffer size
-engine e      use engine e, possibly a hardware device.
Cipher Types
-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1
-aes-128-cfb8              -aes-128-ecb               -aes-128-ofb
-aes-192-cbc               -aes-192-cfb               -aes-192-cfb1
-aes-192-cfb8              -aes-192-ecb               -aes-192-ofb
-aes-256-cbc               -aes-256-cfb               -aes-256-cfb1
-aes-256-cfb8              -aes-256-ecb               -aes-256-ofb
-aes128                    -aes192                    -aes256
-bf                        -bf-cbc                    -bf-cfb
-bf-ecb                    -bf-ofb                    -blowfish
-cast                      -cast-cbc                  -cast5-cbc
-cast5-cfb                 -cast5-ecb                 -cast5-ofb
-des                       -des-cbc                   -des-cfb
-des-cfb1                  -des-cfb8                  -des-ecb
-des-ede                   -des-ede-cbc               -des-ede-cfb
-des-ede-ofb               -des-ede3                  -des-ede3-cbc
-des-ede3-cfb              -des-ede3-cfb1             -des-ede3-cfb8
-des-ede3-ofb              -des-ofb                   -des3
-desx                      -desx-cbc                  -rc2
-rc2-40-cbc                -rc2-64-cbc                -rc2-cbc
-rc2-cfb                   -rc2-ecb                   -rc2-ofb
-rc4                       -rc4-40                    -seed
-seed-cbc                  -seed-cfb                  -seed-ecb
-seed-ofb

暗号化のタイプについては、ちょっとよくわからないが、
ここらへん見ればそれとなく知ることができそう。
暗号化のタイプについて

サンプルとかでも、 -aes-128-cbc が使われてるので特に考えなしに使ってみよう。

試してみよう

# 暗号化前のテキスト用意
echo "平文で書いちゃうよ" > plane.txt

# 暗号化して、ファイルに保存
# 実行時にパスワード設定を求められる。
openssl enc -aes-256-cbc -e -base64 -in plane.txt -out encrypt.txt

# 復号化して、もともと書いてあったテキストを取得
# 実行時に先程設定したパスワード入力を求められる。
openssl enc -aes-256-cbc -d -base64 -in encrypt.txt -out decrypt.txt

# 復号化した結果
cat decrypt.txt

# もとの内容が取得できる。
# ==> 平文で書いちゃうよ

-base64は別になくてもいいけど、つけない場合バイナリで吐かれる。

もとの文字列に復号できるの、なんか感動しませんか?笑

実用的に使うには

-in -out オプション使うと、全てファイルでやり取りする事になるのでちょっと面倒ですよね?
暗号化ファイルはともかく、それ以外はファイル経由しない方が使いやすいかと思います。

パイプで、テキストを入力して、
標準出力に復号化した内容を吐き出したい場合は、下記のように書きます。

# パイプで受け取った文字列を、暗号化してファイルに保存
# 実行時にパスワード設定を求められる。
echo "秘密のテキスト" | openssl aes-256-cbc -e -base64  -out encrypt.txt

# 復号化して、標準出力に
# 実行時に先程設定したパスワード入力を求められる。
cat encrypt.txt | openssl aes-256-cbc -d -base64
# ==> 秘密のテキスト

enc サブコマンドは、暗号化タイプを前に書くことで省略する事が可能です。

トークンなどをローカルに暗号化して保存

で、表題の通り何かしらのアクセストークンとかを
スクリプトで使う場合、平文で保存しておくのが不安かと思うので、
下記のように、暗号化してローカルに保存するようにすれば、便利かと思います。

#!/usr/bin/env bash

set -u

tokenDir=~/.config/path/to/dir
tokenFile=token.enc

# トークンがなければ、入力を求める。
if [ ! -f "$tokenDir/$tokenFile" ]; then
    echo "Enter Token"
    read inputToken

    mkdir -p $tokenDir
    echo "$inputToken" | openssl aes-256-cbc -e -base64 -out $tokenDir/$tokenFile
    echo "...Token saved."
fi

# 復号化してトークンを取得
token=$(cat $tokenDir/$tokenFile | openssl aes-256-cbc -d -base64)
if [ 0 -ne $? ]; then
    echo "Invalid password."
    exit 1
fi

# TODO: something
echo $token

おしまい

なんとなく、これでローカルファイルに保存しておいても大丈夫な気がしますよね♪

1件のコメント

コメントを残す