はじめに
なんか良いストレージサービス無いかなーなんて探したりとかしたことありませんか?
でもあるじゃないですか。すぐそこに。
普通に置く
GitHubには1ファイル当たり100MBの制限があるのでそのままではできないことがあります。
自分は大きなファイルの保存を試みようとしたので当然です。
じゃあ分割すれば良いじゃない!
ファイル名もバレたくないしテキストファイルでファイル名とか管理するのもなぁ
じゃあどうしたか
じゃあ分割したついでに暗号化すればいいじゃない! ついでにファイル名変更の対応表も自動生成しちゃえ!
という訳でつくったのがこれ
ドキュメントの類全く書いてないですが使い方は難しくない方だと思います。JitPackで入れましょう。
下準備
gitリポジトリを作りましょう
cd locked/
git init
git remote add origin https://github.com/nao20010128nao/somewhere-secret.git
ベースファイルシステムを読み込む
全部Kotlinで書きます。importはcom.nao20010128nao.Cryptorage.*
にして下さいね
// ローカルから開く
val fs = File("secure/").asFileSource()
// GitHubのリポジトリから開く
val fs = URL("https://github.com/nao20010128nao/somewhere-secret/raw/inexistent/").asFileSource()
// メモリ上に展開する
val fs = newMemoryFileSource()
これでFileSource
というCryptorage専用のファイルシステムを取得することができます。
暗号化ストレージを開く
暗号化はAES-128を用いています。
暗号鍵はパスワードから決定的に導かれます。
// シンプルな暗号ストレージ(V1)
val cryptorageV1 = fs.withV1Encryption("パスワード")
// 対応表の在り処すら特定困難にしたストレージ(V2)
val cryptorageV2 = fs.withV2Encryption("パスワード")
簡素化のためにパスワードだけの例を示しましたが、V1に限りPair<ByteArray, ByteArray>
をAES鍵として指定できたりします。
書き込む
CryptorageのAPIはGuavaのByteSink/ByteSourceを使っています。
// ByteSinkのAPIを活用
cryptorage.put("filename").write("This is a secret string!!!".toByteArray())
// OutputStreamで扱う
val os = cryptorage.put("filename").openStream()
// 書き込み操作
os.close()
読み込む
// 最初から
val is = cryptorage.open("filename").openStream()
// 途中から (分割をしているので途中からでもコストは低い)
val is = cryptorage.open("filename", offset).openStream()
// isはInputStreamなので好きに扱いやすいと思われる
ファイル一覧を確認
cryptorage.list()// Array<String>
消す
cryptorage.delete("filename")
変更を保存
cryptorage.commit()
後始末
CryptorageはCloseable
なのでCloser系ユーティリティーが使えます。
cryptorage.close()
アップロード
git add .
git commit -mChanged
git push
などなど
こんな感じでファイルを分割しつつ暗号化してGitHubに保管できます。
ちなみにGitHubのブランチ当たりのサイズには限界があるようなので、ブランチを適宜切ったりして超えないように注意して下さい。