コンテンツにスキップ

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.zipxxxxxxxxは、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のチュートリアルは終了です。