-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy patharchive
executable file
·210 lines (175 loc) · 5.94 KB
/
archive
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
#!/usr/bin/env sh
# AES SHA256 CBC 暗号化スクリプト (UTF-8)
# =======================================
#
#
# OpenSSL の AES-256-CBC と「共通鍵」を使ってファイルを暗号化します。
#
# - 使い方の例:
# 以下のコマンドで圧縮&暗号化済みファイル `myfile.txt.tar.gz.aes` が作成されます。
# $ ./archive myfile.txt
#
# - 注意:利用前にスクリプトに実行権限を与えるのを忘れないでください。
#
# -----------------------------------------------------------------------------
# Requirement check
# -----------------------------------------------------------------------------
if ! type openssl 2>/dev/null 1>/dev/null; then
echo >&2 '暗号化に必要な openssl コマンドがインストールされていません。'
exit 1
fi
getRandStr() {
openssl rand -hex 16 2>&1
}
md5f() {
if type md5sum 1>/dev/null 2>/dev/null; then
md5sum <"$1"
return $?
fi
if type md5 1>/dev/null 2>/dev/null; then
md5 -q "$1"
fi
}
# ヘルプ表示
# ----------
if [ $# -lt 1 ]; then
echo
echo "ファイルを圧縮して暗号化します。(AES-256-CBC暗号)"
echo
echo "使い方: $0 <input file> [<output file>]"
echo
echo "- <input file> : 圧縮&暗号化したいファイルのパス"
echo
echo "[オプション]"
echo "- <output file> : 圧縮&暗号化済みファイルの出力先のパス"
echo " 指定がない場合は <input_file>.tar.gz.aes として出力されます。"
echo
exit 1
fi
# コマンド引数取得
# ----------------
INPUTFILE="$1"
if [ ! -r "$INPUTFILE" ]; then
echo >&2 "圧縮&暗号化したいファイル ${INPUTFILE} が見つかりません。"
exit 1
fi
# 出力ファイル名設定
# ------------------
OUTPUTFILE="$(basename "$INPUTFILE").tar.gz.aes"
if [ $# -eq 2 ]; then
OUTPUTFILE=$2
fi
# 暗号ファイル保存先ディレクトリの作成
# ------------------------------------
printf "%s" "- アーカイブ用ディレクトリを作成しています ... "
TEMPDIR="./$(basename "$INPUTFILE")-archive/"
if ! mkdir -p "$TEMPDIR"; then
echo >&2 "NG:ディレクトリを作成できませんでした。"
echo >&2 "- 書き込み権限などを確認してください。"
exit 1
fi
echo "OK"
ARCHIVE_PATH="${TEMPDIR}${OUTPUTFILE}"
PASSWORD_PATH="${TEMPDIR}${OUTPUTFILE}.passwd"
TEMPFILE="$(basename "$INPUTFILE").tar.gz"
# パスワードの生成
# ----------------
printf "%s" "- 共通鍵を作成しています ... "
if ! PASSWORD="$(getRandStr)"; then
echo >&2 'OpenSSL によるランダム値の取得に失敗しました。'
echo >&2 "エラー内容: ${PASSWORD}"
exit 1
fi
if ! (
umask 077
echo "$PASSWORD" >"${PASSWORD_PATH}"
); then
echo >&2 "NG:ファイルを作成できませんでした。"
echo >&2 "書き込み権限などを確認してください。"
exit 1
fi
echo "OK"
# ファイルの圧縮&暗号化
# ----------------------
# - 参考文献:https://qiita.com/kite_999/items/cc39179463fd061b2e7d
printf "%s" "- ファイルを TAR/GZIP 圧縮 → AES 暗号化します ... "
if ! tar -C "$(dirname "$INPUTFILE")" -czf "${TEMPDIR}${TEMPFILE}" "$(basename "$INPUTFILE")"; then
echo >&2 "NG:ファイルを圧縮できませんでした。"
exit 1
fi
if ! openssl enc -e -aes-256-cbc -salt -k "$PASSWORD" -out "${ARCHIVE_PATH}" <"${TEMPDIR}${TEMPFILE}"; then
echo >&2 "NG:ファイルを暗号化できませんでした。"
exit 1
fi
echo "OK"
echo
echo "✅ ${INPUTFILE} の圧縮&暗号化が完了しました。"
echo " - ファイル名:${ARCHIVE_PATH}"
echo
echo "【テスト】共通鍵の動作確認および復号・解凍のテストを行います:"
echo
# 共通鍵の読み込み
# ----------------
printf "%s" "- 共通鍵を読み込んでいます ... "
if ! PASSWORD=$(cat "${PASSWORD_PATH}"); then
echo >&2 "NG:共通鍵を読み込めませんでした。"
exit 1
fi
echo "OK"
# ファイルの復号テスト
# --------------------
printf "%s" "- 共通鍵でファイルを復号しています ... "
if ! openssl enc \
-d -aes-256-cbc \
-salt \
-k "$PASSWORD" \
-in "${ARCHIVE_PATH}" \
-out "${TEMPDIR}${TEMPFILE}"; then
echo >&2 "NG:ファイルを復号できませんでした。"
exit 1
fi
echo "OK"
# 解凍のテスト
# ------------
printf "%s" "- 復号された圧縮ファイルの解凍をしています ... "
if ! tar -C "$TEMPDIR" -xf "$TEMPDIR$TEMPFILE"; then
echo >&2 "NG:ファイルを解凍できませんでした。"
exit 1
fi
echo "OK"
# オリジナルと解凍後の同一テスト
# ------------------------------
printf "%s" "- オリジナルと解凍済みのファイルのハッシュを比較しています ... "
HASHORIGINAL=$(md5f "$INPUTFILE")
HASHARCHIVED=$(md5f "$TEMPDIR$(basename "$INPUTFILE")")
if [ "$HASHORIGINAL" = "$HASHARCHIVED" ]; then
echo "OK"
else
echo >&2 "NG ハッシュ値が一致しません"
exit 1
fi
# 作業ファイルの削除
# ------------------
printf "%s" "- 作業ファイルの削除をしています ... "
if ! (rm -f "$TEMPDIR$TEMPFILE" "$TEMPDIR$(basename "$INPUTFILE")"); then
echo >&2 "NG:作業ファイルを削除できませんでした。"
exit 1
fi
echo "OK"
# 終了表示
# --------
echo
echo "✅ ファイルの圧縮・暗号化が完了しました。"
echo " 以下のファイルをセットでご利用ください。"
echo
echo " - 出力先ディレクトリ:${TEMPDIR}"
echo " - 対象ファイル : ${OUTPUTFILE}"
echo " - 共通鍵ファイル: ${OUTPUTFILE}.passwd"
echo
echo "‼️ 注意 ‼️"
echo "共通鍵は平文であるため、相手の公開鍵で暗号化して送ることを強くおすすめします。"
echo "GitHub の公開鍵を使った暗号化は enc コマンドを利用ください。"
echo
exit 0
#echo $(dirname ${0})
# Restore