LoginSignup
9
1

More than 5 years have passed since last update.

GitHub as a storage

Posted at

はじめに

なんか良いストレージサービス無いかなーなんて探したりとかしたことありませんか?
でもあるじゃないですか。すぐそこに。

:thinking:

普通に置く

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のブランチ当たりのサイズには限界があるようなので、ブランチを適宜切ったりして超えないように注意して下さい。

9
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1