暗号アルゴリズム AES-GCM-SIV を Java で扱う(M1 Macでのハマりポイントもついでに)
はじめに
重要なデータを保護するために、暗号アルゴリズムを扱うことは多々あるかと思います。
その際、Google Tink を採用するアプローチは比較的多いんじゃないでしょうか。
ニーズに最適な暗号アルゴリズムを選定する際、Tink では言語別にサポートされているキータイプが異なる事情[1]を考慮する必要があります。私は JVM 系の言語で AES-GCM-SIV を扱いたい事情があったため、Conscrypt を JCE セキュリティプロバイダにインストールする必要があるのですが、公開されているアーティファクトに M1 Mac 用のものがなかった [2]ため、正直少しハマりました...。
ちなみに、これは Conscrypt 本家に Add support to osx-aarch_64 #1034 で報告されていて、神が対処法を用意してくれています。そのうち M1 用のアーティファクトも公開してくれるんじゃないかなと思うんですが、それまでは開発者がなんとかする必要あるので、同じ悩みを抱えた人へ向けたメモとしてここに残すことにしました。
動作環境
チップ: Apple M1 Pro
macOS: Sonoma 14.3
Setup
ドキュメントに従って準備を進めますが、JVM 系の言語で AES-GCM-SIV を扱う場合はいくつか追加でやることがあります。
dependencies の追加
M1 Mac の考慮が不要な場合
M1 Mac を考慮しない場合は以下でOKです。
// Tink
implementation 'com.google.crypto.tink:tink:1.13.0'
implementation 'org.conscrypt:conscrypt-openjdk-uber:2.5.2'
M1 Mac の考慮が必要な場合
M1 Mac を考慮する場合、自前でビルドしたアーティファクトの用意が必要なので、一工夫する必要があります。以下に一例を示します(これは最適なやり方ではないため、社内 Nexus に配置する等、各々の環境に合うアプローチを選択してもらえればと思います)。
工夫しない場合、前述の問題による以下のようなエラーが出力されてしまいます。
java.lang.UnsatisfiedLinkError: no conscrypt_openjdk_jni-osx-aarch_64 in java.library.path
これを解消するためには、Conscrypt のアーティファクトを M1 Mac で自前ビルドして、それをクラスパス上に存在させる必要があります。自前ビルドは、https://github.com/google/conscrypt/blob/master/BUILDING.md に記載されている手順に従えば問題なくできます(手順上、cmake
と ninja
は使えるようにしておく必要がある)。
新しいキーセットを生成する
KeysetHandle を使用すると、新しいキーセットを作成することができます。
今回は AES-GCM-SIV を最長の長さで扱いたいため、AesGcmSivKeyManager.aes256GcmSivTemplate()
を引数に渡して生成しています。また、JVM 系の言語で AES-GCM-SIV を扱いたい場合、Conscrypt を活用する必要があるので少しコードを追加しています。
AES-GCM-SIV での暗号化/復号化を試してみる
Demo 用に以下のクラスを用意しました。
動くことも確認できて嬉しい。
おわりに
対処法を用意してくれた prbprbprb 氏に感謝...。
Discussion