コンテンツにスキップ

ZIP暗号/複号アプリを作ってみる(bashスクリプト)

はじめに

Rakuten Rapid APIのDAuth トライアル(評価版)を使用して、簡単なZIP暗号/複号アプリケーションを作ります。

YubiKeyのOTP(ワンタイムパスワード)を使用することで、ユーザはZIPの暗号化/復号する際のパスワード入力が不要になります。

画面

準備するもの

  • DAuthアカウント (チュートリアル Step 1で作成済み)
  • Rakuten Rapid APIのアカウント (チュートリアル Step 1で作成済み)
  • YubiKey
  • インターネットに接続したPC (Webブラウザ)
  • サンプルアプリケーションを動かす端末(OS:Linux系)

このチュートリアルは、AWSのEC2(Amazon Linux2)上で作成しています。 OSが違う環境で作成する場合は、本手順と若干異なる場合があります。

DAuth等のアカウントが未登録の場合は、Step1を参照してください。

環境

DAuthのトライアル版(Rakuten Rapid APIマーケットプレイスモデル)で構築します。

料金は発生しませんが、下記の制限があります。

  • APIのリクエスト数に上限(ハードリミット)がある
  • 利用期限は1ヶ月間

この制限は、通常プランに変更することで解除できます。 通常プランへの切り替え方法は、こちらを参照してください。

注意事項

本アプリケーションで圧縮・暗号化した場合、DAuthのトライアル用アカウントの期限超過、DKVSの該当データが削除された場合、データの解凍・複号ができなくなります。

圧縮・暗号化前のオリジナルデータを削除しないようにしてください。

このサンプルアプリケーションの目的は、YubiKeyをログイン認証以外で使うことにあります。
セキュリティについては、利用される環境のセキュリティポリシーに合わせてご対応ください。

また、本アプリケーションの使用により生じる如何なる損害に対しても、その法的根拠に関わらず弊社は責任を負いません。

上記の内容に同意した上でご利用ください。

GitHub

このチュートリアルで使用するプロクラムは、GitHubで公開されています。
ご不明な点などあれば、GitHubにてご質問ください。

GitHub : dauth-yubikey-zip-bash

チュートリアル開始

1. 本アプリケーション用のAPIキーを作成する

画面

1-1. DAuthのWebコンソールにログインする。

画面

1-2. APIキーの管理画面に移動する。

画面

1-3. [新規作成]をクリックする。

1-4. 必要事項を入力して[保存]をクリックする。

画面

[YubiKey API(認可)]と[DKVS API(認可)]は、必要最低限の項目のみチェックします。
各項目の詳細は、こちらを参照してください。

1-5. APKキーが発行されます。

画面

作成したAPIキーは、"手順4-2"と"手順5-1"で使用します。

2. YubiKeyを登録する

画面

2-1. YubiKeyの管理画面に移動する。

画面

2-2. [新規作成]をクリックする。

2-3. 必要事項を入力して[保存]をクリックする。

画面

[ネームスペース]は、"手順1-5"で作成したAPIキーのネームスペースと同じにします。

画面はYubiKey購入後にAESを変更していないときの入力例です。
AESを変更したYubiKeyを登録する場合は、独自AESにチェックを付け、AESを入力する必要があります。 各項目の詳細は、こちらを参照してください。

3. 必要なアプリケーションをインストールする

3-1. アプリケーションを動かす端末(sshなど)に接続します

ここでは、EC2(OS:Amazon Linux2)にssh接続しています。

3-2. 必要なアプリケーションがインストールされているか確認します。

必要なアプリケーション一覧

  • zip
  • curl
  • jq
$ zip -v
Copyright (c) 1990-2008 Info-ZIP - Type 'zip "-L"' for software license.
This is Zip 3.0 (July 5th 2008), by Info-ZIP.
Currently maintained by E. Gordon.  Please send bug reports to
the authors using the web page at www.info-zip.org; see README for details.
  :
  :

$ curl -V
curl 7.61.1 (x86_64-koji-linux-gnu) libcurl/7.61.1 OpenSSL/1.0.2k zlib/1.2.7 libidn2/2.3.0 libssh2/1.4.3 nghttp2/1.41.0
Release-Date: 2018-09-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy Metalink 
  :
  :

$ jq -V
jq-1.5

インストールされてない場合は、各OSに合わせた方法でインストールしてください。

4. ZIP(圧縮 + 暗号化)アプリケーションを作成する

画面

4-1. RapidAPI-Keyを取得する

画面

DAuth トライアル(評価版) エンドポイントの[X-RapidAPI-Key]の値をコピーします。
コピーが上手くできないときは、画面右側のプログラムコードに書かれている"x-rapidapi-key"の値をコピーしてください。
この値は、次の"手順4-2"と"手順5-1"で使用します。

4-2. ZIPスクリプト作成

仕組みは下記のとおりです。

画面

$ mkdir sample
$ cd sample

sampleディレクリ直下に、下記の内容でzip.shを作成します。

#!/bin/bash

# Usage : zip.sh source.txt otp

# ここの値を入れ替える    
APIKEY=<API KEY>
RAPIDKEY=<RAPID KEY>

# ランダム文字生成
PASSWORD=$(tr -dc 'A-Za-z0-9#%@&()' < /dev/urandom | fold -w64 | head -n 1)
KEY=$(tr -dc 'A-Za-z0-9' < /dev/urandom | fold -w8 | head -n 1)

ZIPFILE=${1}
OTP=${2}
KEYID=${OTP::12}

# call DAuth API

# Rapid
RESULT=$(curl \
  -X POST \
  -s \
  -H "X-DAUTH-API-KEY:${APIKEY}" \
  -H "x-rapidapi-key: ${RAPIDKEY}" \
  -H "Content-Type: application/json" \
  -d '{"device_id":"'${KEYID}'", "key":"'${KEY}'", "value":"\"'${PASSWORD}'\""}' \
  'https://dauth-trial.p.rapidapi.com/v1/dkvs' \
)

# Error check
if [ "`echo ${RESULT} | grep 'errors'`" ] ; then
  echo "Error!!"
  echo "`echo ${RESULT} | jq -r '.errors[0].message'`"
  exit 1
fi

# zip
zip -e --password=${PASSWORD} ${ZIPFILE}.${KEY}.zip ${ZIPFILE}

下記の値を入れ替えます。

<API KEY>は、"手順1-5"で作成したAPIキーを入力します。
<RAPID KEY>は、"手順4-1"でコピーしたRapidAPI-Keyを貼り付けます。

4-3. テスト

$ chmod +x zip.sh
$ date > test.txt
$ ./zip.sh test.txt <YUBIKEY OTP>
$ ls
test.txt  test.txt.Sf8f0aHc.zip  zip.sh

ZIPするテストファイル(test.txt)を作成します。

サンプルアプリケーションでZIP(圧縮+暗号化)し、ファイル(test.txt.Sf8f0aHc.zip)が作成されたのを確認します。

<YUBIKEY OTP>は、"手順2-3"で登録したYubiKeyのワンタイムパスワードを入力します。

<元のファイル名>.xxxxxxxx.zipxxxxxxxxは、DKVSのKeyです。Valueが暗号化したときのパスワードになります。

4-4. DKVSにデータが登録されたのを確認

画面

Webコンソールで、サンプルアプリケーションからDKVSにデータが登録されたのを確認します。

5. UNZIP(復号)アプリケーションを作成する

5-1. UNZIPスクリプト作成

仕組みは下記のとおりです。

画面

sampleディレクリ直下に、下記の内容でunzip.shを作成します。

#!/bin/bash

# Usage : unzip.sh file.xxxxxxxx.zip otp

# ここの値を入れ替える    
APIKEY=<API KEY>
RAPIDKEY=<RAPID KEY>

# test.txt.XXXXXX.zip -> XXXXXX
ZIPFILE=${1}
KEY=$(echo ${ZIPFILE} | sed 's/^.*\.\([^\.]*\)\.\([^\.]*\)$/\1/')
OTP=${2}

# call DAuth API
RESULT=$(curl \
  -s \
  -H "X-DAUTH-API-KEY:${APIKEY}" \
  -H "x-rapidapi-key: ${RAPIDKEY}" \
  "https://dauth-trial.p.rapidapi.com/v1/dkvs/yubikey_otp?key=${KEY}&otp=${OTP}")

# Error check
if [ "`echo ${RESULT} | grep 'errors'`" ] ; then
  echo
  echo "Error!!"
  echo "`echo ${RESULT} | jq -r '.errors[0].message'`"
  exit 1
fi

PASSWORD=`echo ${RESULT} | jq -r '.[0].value'`

unzip -o -P ${PASSWORD} ${ZIPFILE}

下記の値を入れ替えます。

<API KEY>は、"手順1-5"で作成したAPIキーを入力します。
<RAPID KEY>は、"手順4-1"でコピーしたRapidAPI-Keyを貼り付けます。

5-2. テスト

$ chmod +x unzip.sh
$ mv test.txt test.txt.org
$ ./unzip.sh test.txt.xxxxxxxx.zip <YUBIKEY OTP>
$ ls
test.txt  test.txt.org  test.txt.xxxxxxxx.zip  unzip.sh  zip.sh

解凍されたのがわかるように、"test.txt"のファイル名を"test.txt.org"に変更します。

サンプルアプリケーションでUNZIP(解凍)し、ファイル(test.txt)が作成されたのを確認します。

<YUBIKEY OTP>は、"手順2-3"で登録したYubiKeyのワンタイムパスワードを入力します。

<ファイル名>.xxxxxxxx.zipxxxxxxxxは、"手順4-3"で作成されたZIPファイル名になります。

以上で、Step 2のチュートリアルは終了です。