メッセージ、パスワードなど文字列の暗号化・復号を行うシェルスクリプト(バッチ処理プログラム) ~opensslコマンドでAESによる共通鍵を用いた暗号化・復号、ハッシュアルゴリズムSHA-512でスクリプトファイル本体からキーを生成~

5月 17, 2017AWS,EC2,Programming,Shell Script

AWS、GCE、Azureなどのパブリッククラウドの普及やスマートデバイスを用いたIoTの流れの中でインターネットを介したデータ通信は当たり前のようになってきており、暗号化技術は益々重要性を増してきています。

一言で暗号化と言っても、暗号化対象のデータや暗号化方式などの組み合わせにより、様々なパターンが存在します。

今回はそんな様々な暗号化方式の中から、スクリプトファイル本体からハッシュ値で共通鍵を生成してメッセージやパスワードなどの文字列を暗号化・復号するシェルスクリプト(バッチ処理プログラム)を紹介します。

メッセージ、パスワードなど文字列の暗号化・復号を行うシェルスクリプト(バッチ処理プログラム) ~opensslコマンドでAESによる共通鍵を用いた暗号化・復号、ハッシュアルゴリズムSHA-512でスクリプトファイル本体からキーを生成~

基本方針としてはopensslコマンドの-des3オプションを用いてAESアルゴリズムによる共通鍵での暗号化・復号を行います。

暗号化・復号に使用する共通鍵は暗号化・復号化を実行するシェルスクリプト(バッチ処理プログラム)そのものに対するSHA-512のファイルハッシュを用います。

そのため、全く同一の内容のシェルスクリプト(バッチ処理プログラム)だけが暗号化に対する復号ができます。

これにより、ファイル内のコメントを変更するだけで違う共通鍵による暗号化・復号を行うようになるため、複数箇所で違う共通鍵を用いて暗号化・復号する場合にコメント変更のみで容易に移行・移植などの準備ができます。

ただ、一方でシェルスクリプト(バッチ処理プログラム)の内容自体が共通鍵の元になるため、シェルスクリプト(バッチ処理プログラム)へのアクセス管理や改ざんなどには十分に注意する必要があります。

メッセージ、パスワードなど文字列の暗号化・復号を行うシェルスクリプト(バッチ処理プログラム)

シェルスクリプト(バッチ処理プログラム)の内容は下記のソースコードにある

「#*****ここに使用する鍵を変更するためのコメントを記載する*****」

という部分にシェルスクリプト(バッチ処理プログラム)毎に共通鍵を変更するためのコメントを記載します。

sha512sumコマンドでシェルスクリプト(バッチ処理プログラム)自体にハッシュをかけて鍵を生成するので、コメント内容は何でも構いません。

わずかなコメントの違い(スペース、タブ、改行)でも共通鍵が変わってくるので注意が必要です。

[mag4j@localhost ~]# vim crypt_string.sh
#!/bin/bash
 
#*****ここに使用する鍵を変更するためのコメントを記載する*****
 
#復号時の一時ファイル保管場所を指定する。
TMP_DIR=/tmp
TMP_FILE_NAME=crypt_string
 
#このスクリプトが存在するディレクトリパスへ移動する。
cd `dirname $0`
#このスクリプトが存在するディレクトリパスを取得。
CUR_DIR=`pwd`
#このスクリプトの名称を取得する。
MYNAME=$(basename $0)
 
#sha512sumでこのスクリプトファイルのハッシュ値を取得し、秘密鍵とする。
KEY=`sha512sum ${CUR_DIR}/${MYNAME} | awk '{print $1}' | tr -d '\n'`
 
#暗号化、復号の処理モードを引数から取得
MODE=$1
 
#暗号化、復号の対象文字列を引数から取得
STR=${@:2}
 
#処理モードの文字列を全て小文字にする。
MODE=`echo "${MODE}" | tr 'A-Z' 'a-z'`
 
 
if [ "${MODE}" = "enc" ]; then
  #処理モードがencの場合、opensslコマンドを用いて暗号化処理を行い、改行を削除して標準出力する。
  echo "${STR}" | openssl enc -e -aes-256-cbc -base64 -k "${KEY}" | tr -d '\n'
elif [ "${MODE}" = "dec" ]; then
  #復号時の一時ファイルのファイル名を時刻より作成する。
  DATE_STR=`date +"%Y%m%d%H%M%S"`
  #入力された文字列を64文字目で改行を行いbase64の形式に戻し、一時ファイルに書き出す。
  echo "${STR}" | fold -64 > ${TMP_DIR}/${TMP_FILE_NAME}_${DATE_STR}
  #処理モードがdecの場合、opensslコマンドを用いて復号処理を行う。
  openssl enc -d -aes-256-cbc -base64 -k "${KEY}" -in ${TMP_DIR}/${TMP_FILE_NAME}_${DATE_STR}
  #一時ファイルの削除
  rm -f ${TMP_DIR}/${TMP_FILE_NAME}_${DATE_STR}
else
  #処理モード文字列がenc, dec以外の場合は使用方法を表示。
  echo "Usage: ${CUR_DIR}/${MYNAME} [enc|dec] [STRING]"
fi

メッセージ、パスワードなど文字列の暗号化・復号を行うシェルスクリプト(バッチ処理プログラム)の実行例

暗号化・復号シェルスクリプト「crypt_string.sh」の実行例を暗号化、復号それぞれ記載します。

暗号化はencオプションを用いて行い、復号はdecオプションを用いて行います。

暗号化、復号どちらも2つ目の引数以降(encまたはdec以降)を全て暗号化、復号の対象文字列として認識するので、文字列にスペース等が含まれていても認識されるようになっています。

ダブルクォーテーション「"」そのものを対象文字列とする場合は「\"」のように「\」記号でエスケープしてください。

[mag4j@localhost ~]# chmod 755 crypt_string.sh

[mag4j@localhost ~]# ./crypt_string.sh enc mag4j.com
U2FsdGVkX1/1ouFheXVmVzFTu/zsfcjc/08w5uKhOak=

[mag4j@localhost ~]# ./crypt_string.sh dec U2FsdGVkX1/1ouFheXVmVzFTu/zsfcjc/08w5uKhOak=
mag4j.com

Reference: Tech Blog citing related sources