ZIP暗号/複号アプリを作ってみる(Windowsスクリプトファイル + GUI付き)¶
はじめに¶
Rakuten Rapid APIのDAuth トライアル(評価版)を使用して、簡単なZIP暗号/複号アプリケーションを作ります。
YubiKeyのOTP(ワンタイムパスワード)を使用することで、ユーザはZIPの暗号化/復号する際のパスワード入力が不要になります。
Point
チュートリアル Step 2のプログラムをWindows + GUI付きで作成します。
準備するもの¶
- DAuthアカウント (チュートリアル Step 1で作成済み)
- Rakuten Rapid APIのアカウント (チュートリアル Step 1で作成済み)
- YubiKey
- インターネットに接続したPC (Webブラウザ)
- サンプルアプリケーションを動かす端末(OS:Windows)
DAuth等のアカウントが未登録の場合は、Step1を参照してください。
動作確認
本プログラムは、Windows 10でのみ動作を確認しています。
他OSでの動作は保証いたしません。
環境¶
DAuthのトライアル版(Rakuten Rapid APIマーケットプレイスモデル)で構築します。
料金は発生しませんが、下記の制限があります。
- APIのリクエスト数に上限(ハードリミット)がある
- 利用期限は1ヶ月間
この制限は、通常プランに変更することで解除できます。 通常プランへの切り替え方法は、こちらを参照してください。
注意事項¶
本アプリケーションで圧縮・暗号化した場合、DAuthのトライアル用アカウントの期限超過、DKVSの該当データが削除された場合、データの解凍・複号ができなくなります。
圧縮・暗号化前のオリジナルデータを削除しないようにしてください。
このサンプルアプリケーションの目的は、YubiKeyをログイン認証以外で使うことにあります。
セキュリティについては、利用される環境のセキュリティポリシーに合わせてご対応ください。
また、本アプリケーションの使用により生じる如何なる損害に対しても、その法的根拠に関わらず弊社は責任を負いません。
上記の内容に同意した上でご利用ください。
GitHub¶
このチュートリアルで使用するプロクラムは、GitHubで公開されています。
ご不明な点などあれば、GitHubにてご質問ください。
GitHub : dauth-yubikey-zip-wsf
チュートリアル開始¶
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. 7-ZIPをインストールする
3-1. 7-ZIPをインストールします。
本アプリケーションは、コマンドラインで暗号化・複号できるZIPアプリケーションが必要です。
今回は7-ZIPを使います。
7-ZIP 公式サイトからダウンロード後、インストールしてください。
4. ZIP(圧縮 + 暗号化)アプリケーションを作成する
4-1. RapidAPI-Keyを取得する
DAuth トライアル(評価版) エンドポイントの[X-RapidAPI-Key]の値をコピーします。
コピーが上手くできないときは、画面右側のプログラムコードに書かれている"x-rapidapi-key"の値をコピーしてください。
この値は、次の"手順4-2"と"手順5-1"で使用します。
4-2. ZIPスクリプトファイル作成
仕組みは"チュートリアル Step 2"と同じです。
まず、作業用のフォルダを用意します。
この手順書では、"デスクトップ"に"yubikey_zip"という作業用フォルダを作成して説明します。
つぎに、作業用フォルダの直下に、下記の内容でzip-gui.wsf
を作成します。
簡単な作りにするため、プログラム言語は"VBScript"と"JavaScript"を使用し、"Windowsスクリプトファイル(wsf)"として 1つのファイルに纏めています。
<job>
<script language="VBScript">
' YubiKeyのワンタイムパスワード入力用ダイアログ
function vbInputBox(prpmpt)
vbInputBox = InputBox(prpmpt)
end function
</script>
<script language="JavaScript">
// ここの値を入れ替える
var APIKEY = "<API KEY>";
var RAPIDKEY = "<RAPID KEY>";
// キーワードに使用する文字種
var KEYBASE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// パスワードに使用する文字種
var PASSBASE = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ#%@";
// 起動時に(ドラッグ&ドロップされた)ファイルを指定されているか確認する
var file_count = WScript.Arguments.Count();
if (file_count != 1) {
WScript.echo("ファイルを1つドラッグアンドドラップして下さい。");
WScript.Quit();
}
// 指定されたZIP対象のファイルをセット
var data_file = WScript.Arguments.Item(0);
// YubiKeyのワンタイムパスワード入力ダイアログを表示
var yubikey_otp = vbInputBox("Enter YubiKey OTP");
if (!yubikey_otp) {
// Cancel
WScript.Quit();
} else if (yubikey_otp.length != 44) {
WScript.echo("YubiKeyのワンタイムパスワードが不正です。");
WScript.Quit();
}
var yubikey_id = yubikey_otp.substr(0, 12);
// パスワードとキーワードを生成
var password = get_random_string(64, PASSBASE);
var keyword= get_random_string(8, KEYBASE);
// DAuth APIでDAuthに登録
var url = "https://dauth-trial.p.rapidapi.com/v1/dkvs";
var data = {
"device_type": 0,
"device_id": yubikey_id,
"key": keyword,
"value": '"' + password + '"'
};
var json = JSON_encode(data);
var result = http_post(APIKEY, RAPIDKEY, url, json);
// 7-ZIPを使用して対象ファイルをZIP(圧縮+暗号化)する
var shell = WScript.CreateObject("WScript.Shell");
var zip_exe = '"C:\\Program Files\\7-Zip\\7z.exe\"';
var zip_file = data_file + "." + keyword + ".zip";
var cmd = zip_exe + ' a -p' + password + ' "' + zip_file + '" "' + data_file + '"';
shell.Run (cmd, 0, true);
WScript.Echo("Zipファイルを作成しました。\r\n" + zip_file);
// DAuth APIにリクエスト(GET)
function http_post(api_key, rapid_key, url, data){
try {
var http = WScript.CreateObject("Msxml2.ServerXMLHTTP");
http.open("POST", url, false);
http.setRequestHeader("X-DAUTH-API-KEY", api_key);
http.setRequestHeader("X-RAPIDAPI-KEY", rapid_key);
http.setRequestHeader("Content-Type", "application/json");
http.send(data);
return http.responseText;
} catch (e) {
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
}
// ランダムの文字列を返す
function get_random_string(len, range) {
var max = range.length;
var code = "";
for (var i = 0 ; i < len ; i++) {
code += range.charAt(Math.floor(Math.random() * max));
}
return code;
}
// JSONエンコード
function JSON_encode(obj){
var htmlfile = WScript.CreateObject("htmlfile");
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=11">');
return htmlfile.parentWindow.JSON.stringify(obj);
}
</script>
</job>
下記の値を入れ替えます。
<API KEY>
は、"手順1-5"で作成したAPIキーを入力します。
<RAPID KEY>
は、"手順4-1"でコピーしたRapidAPI-Keyを貼り付けます。
4-3. テスト
まず、作業用フォルダにZIPする適当なファイル"test.txt"を用意します。
つぎに、"test.txt"を"zip_gui.wsf"にドラッグアンドドロップします。
"手順2-3"で登録したYubiKeyのワンタイムパスワード(OTP)を入力し[OK]をクリックします。
ZIPが成功すると、ZIP(圧縮+暗号化)したファイル名がが表示されます。
<元のファイル名>.xxxxxxxx.zip
のxxxxxxxx
は、DKVSのKeyです。Valueが暗号化したときのパスワードになります。
4-4. DKVSにデータが登録されたのを確認
Webコンソールで、サンプルアプリケーションからDKVSにデータが登録されたのを確認します。
5. UNZIP(復号)アプリケーションを作成する
5-1. UNZIPスクリプトファイル作成
仕組みは"チュートリアル Step 2"と同じです。
作業用フォルダの直下に、下記の内容でunzip-gui.wsf
を作成します。
<job>
<script language="VBScript">
'YubiKeyのワンタイムパスワード入力用ダイアログ
function vbInputBox(prpmpt)
vbInputBox = InputBox(prpmpt)
end function
</script>
<script language="JavaScript">
// ここの値を入れ替える
var APIKEY = "<API KEY>";
var RAPIDKEY = "<RAPID KEY>";
// 起動時に(ドラッグ&ドロップされた)ファイルを指定されているか確認する
var file_count = WScript.Arguments.Count();
if (file_count != 1) {
WScript.echo("ファイルを1つドラッグアンドドラップして下さい。");
WScript.Quit();
}
// 引数をセット
var zip_file = WScript.Arguments.Item(0);
var keyword = get_key_from_file(zip_file);
var yubikey_otp = vbInputBox("Enter YubiKey OTP");
if (!yubikey_otp) {
// Cancel
WScript.Quit();
} else if (yubikey_otp.length != 44) {
WScript.echo("YubiKeyのワンタイムパスワードが不正です。");
WScript.Quit();
}
// DAuthからパスワード取得
var url = "https://dauth-trial.p.rapidapi.com/v1/dkvs/yubikey_otp?key=" + keyword + "&otp=" + yubikey_otp;
var result = http_get(APIKEY, RAPIDKEY, url);
var json = JSON_decode(result);
var password = json[0]["value"];
// 7-ZIPを使用してZIPファイルを(解凍+複号)する
var shell = WScript.CreateObject("WScript.Shell")
var zip_exe = "\"C:\\Program Files\\7-Zip\\7z.exe\""
var out_path = get_parent_folder(zip_file);
var cmd = zip_exe + " x -y -o\"" + out_path + "\" -p" + password + " \"" + zip_file + "\""
shell.Run (cmd, 0, true)
WScript.Echo("解凍しました");
// test.txt.xxxxxxxx.zip => xxxxxxxxを抽出
function get_key_from_file(file_name) {
var words = file_name.split(".");
return words[words.length - 2];
}
// JSONデコード
function JSON_decode(str){
var htmlfile = WScript.CreateObject("htmlfile");
htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=11">');
return htmlfile.parentWindow.JSON.parse(str);
}
// DAuth APIにリクエスト(GET)
function http_get(api_key, rapid_key, url){
try {
var http = WScript.CreateObject("Msxml2.ServerXMLHTTP");
http.open("GET", url, false);
http.setRequestHeader("X-DAUTH-API-KEY", api_key);
http.setRequestHeader("X-RAPIDAPI-KEY", rapid_key);
http.send();
return http.responseText;
} catch (e) {
WScript.Echo("Error(" + (e.number & 0xFFFF) + "):" + e.message);
}
}
// ファイル関連の操作を提供するオブジェクトを取得
function get_parent_folder(file) {
var fs = new ActiveXObject("Scripting.FileSystemObject");
return fs.GetParentFolderName(file);
}
</script>
</job>
下記の値を入れ替えます。
<API KEY>
は、"手順1-5"で作成したAPIキーを入力します。
<RAPID KEY>
は、"手順4-1"でコピーしたRapidAPI-Keyを貼り付けます。
5-2. テスト
まず、解凍されたのがわかるように、"test.txt"のファイル名を"test.txt.org"に変更します。
つぎに、作業用フォルダで"手順4-3"でZIP(圧縮+暗号化)したファイルを"unzip-gui.wsf"にドラッグアンドドロップします。
"手順2-3"で登録したYubiKeyのワンタイムパスワード(OTP)を入力し[OK]をクリックします。
ZIPファイルが解凍+複号され"test.txt"が作成されたのを確認します。
以上で、Step 3のチュートリアルは終了です。