ともちんの Tech ブログ

暗号化ツールキット Keyczar についてのまとめ

Keyczar は、Google 社によって開発されていたオープンソースの暗号化ツールキットです。

2008年に公開されたこのツールキットはハッシュ値の衝突が発見された SHA-1ハッシュ関数として採用しているため現在は非推奨となっており、開発も終了しています。

しかしながら、未だに暗号化のライブラリとして Keyczar を利用しているプロジェクトも少なくありません。

そのようなプロジェクトから Keyczar を取り除き、新しいライブラリにアップデートすることを今週末の目標としていました。

Keyczar の後継は、同じく Google 社によって開発されている Tink です。

今週末は、Keyczar の設計原則とコードを読みながら、実際にプロジェクトでどのように使われているのかをインプットし、Tink によってどのように置き換えることができるのか、Tink のインプットを行いました。

土日でプルリクを出せればいいなと思っていたのですが、思っていたよりも既存のプロジェクトに Tink を導入するのに手間取ったため、目標達成とはなりませんでした。

そこで、土日の成果の一つとして Keyczar の設計原則についてまとめていきたいと思います。

今後非推奨であっても、既存のプロジェクトから移行するには Keyczar について知っておいて損はないので、その際はよければご参考にしてください。

Keyczar とは

Keyczar は、Google 社によって開発されていた OSS の暗号化ツールキットです。

Keyczar は以下に列挙した暗号化アルゴリズムを提供しています。

いずれもハッシュ関数として SHA-1 を利用しています。SHA-1 は、160ビット長のダイジェストを生成します。

SHA-1 は、2005年からハッシュ値の衝突が理論的に示されており、2017年には Google 社によって衝突例が示されました。

これを受けて、SHA-1 ではなく SHA-256 のようなより安全なハッシュ関数を利用すべきだという声が大きくなっています。

このような背景を受けて、Keyczar のサポートは終了し、よりセキュアでより使いやすく拡張性があるツールキットとして Tink が開発されました。

ここでは、Keyczar における鍵の管理方法と暗号化・署名の方法について見ていきます。

鍵のメタデータ

一般に、暗号化には鍵が必要で、Keyczar はこの鍵の情報を KeyMetadata というメタデータとして保持しています。

メタデータは、以下のデータから成り立ちます。

  • 名前 (文字列)
  • 鍵の目的 KeyPurpose
  • 鍵のタイプ KeyType
  • KeyVersion の集合

KeyPurpose は、鍵の使用方法を表す列挙型の値です。以下の値があります。

  • DECRYPT_AND_ENCRYPT: 鍵は暗号化と復号に使われる。
  • ENCRYPT: 鍵は暗号化に使われる。
  • SIGN_AND_VERIFY: 鍵は署名と検証に使われる。
  • VERIFY: 鍵は検証に使われる。
  • TEST: テスト用。

KeyType は、鍵がどの暗号化アルゴリズムで用いられるかを表す値です。暗号化アルゴリズムごとに必要とされる鍵の長さが異なるので、DefaultKeyType で値が定義されています。例えば、HMAC SHA-1 の場合は256ビット長の鍵が必要です。

  • AES
  • HMAC_SHA1
  • DSA_PRIV
  • DSA_PUB
  • RSA_PRIV
  • RSA_PUB

KeyVersion は、以下からなる鍵バージョンです。

  • version number: 1から始まる整数で、鍵ごとに固有である。
  • KeyStatus
  • exportable: 鍵を Keyczar の外部にエクスポートするかどうかを表す真理値。

KeyStatus には、3つの状態があります。

  • Primary: 鍵は、既存のデータを検証または復号することができ、新しいデータを署名または暗号化することができる。
  • Active: 鍵は、既存のデータを検証または復号することしかできない。
  • Inactive: 鍵は、既存のデータを検証または復号しかできず、いつでも取り消すことができる。

Keyczar は鍵のメタデータを管理することによって、暗号化アルゴリズムを使用して暗号化や復号、署名や検証を行います。

鍵の取得と暗号化アルゴリズムの適用

暗号化アルゴリズムは鍵のメタデータによって識別できます。鍵のメタデータや鍵自身を読み込むインタフェースとして KeyczarReader があります。

Keyczar では、Crypter クラスや Signer クラスに KeyczarReader を登録することによって、鍵のメタデータに応じた暗号化と復号あるいは署名と検証をすることができます。

Signer は、文字列が入力されると Base64 で符号化されたバイト列を署名として返します。また、文字列と署名を入力として、検証を行います。

メッセージ認証の例

実際に、Signer を使ってメッセージ認証をしてみましょう。使用するアルゴリズムは HMAC SHA-1 です。以下がそのソースコードです。

コメントにも書いてある通り、KeyczarReader はインタフェースであるため、実装する必要があります。

KeyczarReader は鍵や鍵のメタデータの取得を行います。今回はその具象クラスとして、ScalaOSS フレームワーク IxiaSKeyReader を用いました。

build.sbt などの細かい設定は Github リポジトリを参考にしてください。

まとめ

おわりに

以上で、Keyczar の概要を一通り説明できたかなと思います。

今回は例でメッセージ認証を取り上げましたが、暗号化と復号も同様の手順で実装することができます。しかし、これから利用し始めるのは推奨されませんので、その代わりに Tink の導入を検討してください。

Tink は、SHA-1 以外のハッシュ関数を利用できるようにした上で、可読性と監査性、拡張性を兼ね備えた暗号化ツールキットです。

Tink についてはまた別記事として取り上げるつもりです。ガイダンスの通りに利用するならとても使いやすいのですが、自前の鍵を使って署名・暗号化したいとなると実装が少し面倒になります。その辺りもいずれ。