LoginSignup
1

More than 5 years have passed since last update.

クライアント側で自前のSymmetric Keyを使ってAzure Storage BLOBを暗号化/複合化してみる

Posted at

はじめに

はじめまして、19日目担当のネクストスケープ配信部の小泉です。
配信に居ながら、配信とはあまり関係ない記事を書こうと思います。。。

今回は、Azureを使っている方なら皆知っている機能であろう、StorageのBLOBで使えるクライアント暗号化機能について紹介していきます。

Azure Storage Clientで暗号化/複合化するメリット

配信部では動画や楽曲といったコンテンツを取り扱う機会が多く、クライアント様によってはコンテンツホルダーから「ファイルを暗号化してクラウド上に保存すること」という規約があったりする場合もあるので、ファイル暗号化してアップロードするという順序で行っていました。

どうしても処理する過程で、暗号化する処理ロジックを書いたり、暗号化したファイルをローカルにテンポラリ保存したり、ファイルを操作する際の例外処理を書いたり、色々面倒なことをする必要がありました。

それが、Azure Storage Client側で行うことが出来るようになったのです!

なぜ"自前の" Symmetric Key で暗号化/複合化してみる

Key Vaultを使ったチュートリアルは、Azureのドキュメントに書かれていますが、自前の"Symmetric Key"を使ったチュートリアルやサンプルのコードが見つからず。

以前からAES暗号化をしていたので、以前と同等の暗号化でファイルを暗号化しながらファイルをアップロードしたかったのです・・・

やってみた

必要なもの
まずは、nugetから下記のライブラリを入れます。

  • Microsoft.WindowsAzure.Storage
  • Microsoft.Azure.KeyVault
  • Microsoft.Azure.KeyVault.Extensions

特にExtensionsが無いとSymmetric Keyが使えないという罠があるので注意。

static void Main(string[] args)
{
    var storageAccount = new CloudStorageAccount(new StorageCredentials("{Storage Account}", "{Storageキー}true);
    var blobClient = storageAccount.CreateCloudBlobClient();
    var blobContainer = blobClient.GetContainerReference("container");
    var blob = blobContainer.GetBlockBlobReference("hello.txt");

    // 暗号化キーの設定(AES128bit)
    byte[] encryptkey = Convert.FromBase64String("gsef2ugs+w1MKrfe848Iesq=="); // Testキー
    SymmetricKey key = new SymmetricKey("TestKey", encryptkey);

    // 暗号化ポリシーの設定
    BlobEncryptionPolicy policy = new BlobEncryptionPolicy(key, null);
    BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy };

    // 暗号化しながらアップロード
    blob.UploadText("hello world!!", Encoding.UTF8, null, options, null); // <- お馴染みの文言付けてみましょう。

    // 復号化しながらダウンロード
    string decryptText = blob.DownloadText(Encoding.UTF8, null, options, null);
    Console.WriteLine("DecryptText: {0}", decryptText);
    // DecryptText: hello world!! <- ちゃんと複合されて読めますね。

    // 復号化しないでダウンロード
    string nondecryptText = blob.DownloadText(Encoding.UTF8, null, null, null);
    Console.WriteLine("NonDecryptText: {0}", nondecryptText);
    // NonDecryptText: Q??2@H?,p?????|? <- 複合出来ずに化けてます。
}

これだけで暗号化しながらアップロード/複合化しながらダウンロードすることが出来るようになりました。
面倒なローカルでテンポラリファイルを作り、暗号化するなんていう面倒な作業が不要になります。

気を付けたいこと

Azure Storage側で暗号化している訳ではなく、クライアント側で暗号化しています。
そのため、マシンスペックにもよりますが、非暗号化のアップロードよりも当然アップロード速度が遅くなることが考えられます。
実装する際には、十分な検証を行ってから入れましょう。。。

さいごに

かなり無駄な処理を省くことが出来るようになったので、個人的には嬉しい機能だなと感じました。
やはり、楽をしたいですよね。(少なくとも私はそうです。。。)
今回はBLOBに限って書きましたが、Queue、Tableについても同様に暗号化が出来る様なので、セキュアに守りたい内容を送る場合には一考にいれるのもありかなと思います。

参考

チュートリアル: Azure Key Vault を使用した Microsoft Azure Storage 内の BLOB の暗号化と復号化
Microsoft Azure Storage のクライアント側の暗号化と Azure Key Vault

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
1