Cipher.getInstanceに「AES」を設定すると暗号モードは何が使用されるのか

IT

androidアプリ診断をしていると「Cipher.getInstanceを使用している場合、安全な暗号を明示的に指定しているか」と確認することがあります。

文書的にはデフォルトで安全でないモードが使用されるからだそうですが、その挙動を見たことが無いので確かめてみました。

参考暗号化ロジック

【Java】標準ライブラリでAES暗号で暗号化する方法 - Qiita
やりたいこと Javaの標準ライブラリを使ってtokenを暗号化して保存したい token情報を取得する際は復号化した状態で使いたい 暗号化と復号化するときの鍵が同じAES暗号を使いたい 暗号化/復号化処理のサンプル ...

とりあえずいじる

まずは「”AES”」指定でやります。

参考プログラムの暗号化ロジックをそのままにしていたら例外が発生しました。

ECBモードではIV(初期化ベクトル)は使えないそうです。

とりあえずいろいろ暗号化する

この時点でECBモードだということがわかりましたが、「test」という文字列を以下のアルゴリズムで暗号化してbase64してみようと思います。

  • AES
  • AES/CBC/PKCS5Padding
  • AES/ECB/PKCS5Padding

鍵は「nick123456789012」、初期化ベクトルはなしでいきます。

AES

uyN/gSYIUYMK6ZTIjQxSwA==

AES/CBC/PKCS5Padding(復号に失敗していました)

qzqaRJlqsgQNmAKaoGp7Rw==

AES/ECB/PKCS5Padding

uyN/gSYIUYMK6ZTIjQxSwA==

AESは「AES/ECB/PKCS5Padding」っぽいですね。

結論

Cipher.getInstanceに「AES」を指定すると「AES/ECB/PKCS5Padding」が使用される。

ECBモードは安全ではないので使用しないこと。

ECB暗号テキストは同じプレーン・テキスト/キーを使用する場合は同一になるため、このモードは、通常は暗号化アプリケーションに適していません。使用しないようにしてください。

Java暗号化アーキテクチャ(JCA)リファレンス・ガイド Cipherクラス-操作モード https://docs.oracle.com/javase/jp/11/security/java-cryptography-architecture-jca-reference-guide.html#GUID-94225C88-F2F1-44D1-A781-1DD9D5094566

終わりに

AESを指定するとデフォルトで何が使用されるかの検証でした。

このあたりの仕様、優しくないです。

検証が終わった後にググったらもっと細かい検証記事が見つかりました。

もっと早く見つけられたら・・・と思いましたが、検証したからこそこの記事の内容も理解できたのではと思いました(そう思わないとやってられないです)

Javaの暗号化アーキテクチャのドキュメントも(上記記事のおかげで)見つかったので今回の検証から得られることは多かったなと思いました。

セキュリティ開発者ガイド
Java暗号化アーキテクチャ(JCA)はプラットフォームの主要な部分であり、プロバイダ・アーキテクチャ、およびデジタル署名、メッセージ・ダイジェスト(ハッシュ)、証明書と証明書検証、暗号化(対称/非対称ブロック/ストリーム暗号)、キーの生成と管理、安全な乱数生成などのための一連のAPIを含んでいます。

コメント

タイトルとURLをコピーしました