「Java」カテゴリーアーカイブ

openssl で AES 暗号化したファイルを java で復号

android で暗号化したファイルを復号しようと思ったが、どのようにするか。 暗号化は、わざわざツールを作るのも面倒なので、openssl でよいかと考えた。 openssl java で検索すると以下のような記事が見つかる。 openssl enc -e -aes-128-cbc で暗号化したファイルの先頭には、Salted__ソルトが入るようだ。 これは、openssl の仕様で、Java の Cipher クラスには、そのようなインタフェースはない。 上記の記事ではそれらを実装しているのだと思うが、面倒だし、openssl 依存というのもなあ、と思った。 とりあえず、man enc してみた。たぶん、そうこうしている間に実装できただろうが。 興味深いオプションとしては、-P オプション、-S オプション、-nosalt オプション、-K、-iv オプションだろうか。
オプション 機能
-P オプション salt、key、iv を表示して終了する。
-S オプション salt を指定して暗号化する。
-nosalt salt を使わない。
-K、-iv -K で指定したキーと -iv で指定した initial vector を使う。
暗号化する時に、Key / iv を表示させて、それを Java の Cipher クラスに渡せばよい。 使用例:
$ openssl enc -aes-128-cbc -P 
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
salt=E89360B042EFDBE0
key=35E38573AB84F2054BB8BCD8E5CD56EE
iv =382EA02910F2C2B5E2990846A30C169D
パスワードは hogehoge を入れてみた。実行毎に salt は変わるので、key/iv は変わる。もし、同じ salt を指定したければ、次のとおり。
$ openssl enc -aes-128-cbc -P -S E89360B042EFDBE0
enter aes-128-cbc encryption password:
Verifying - enter aes-128-cbc encryption password:
salt=E89360B042EFDBE0
key=35E38573AB84F2054BB8BCD8E5CD56EE
iv =382EA02910F2C2B5E2990846A30C169D
試しに salt を指定して暗号化したファイルの hexdump。
$ openssl enc -aes-128-cbc -S E89360B042EFDBE0 -in hoge.txt -out hoge.txt.enc
$ hexdump -C hoge.txt.enc 
00000000  53 61 6c 74 65 64 5f 5f  e8 93 60 b0 42 ef db e0  |Salted__..`.B...|
00000010  65 f6 60 7a 8f f7 e3 21  a3 b2 dd a1 5c a7 dd be  |e.`z...!....\...|
00000020
(-nosalt を使えば、Salted__ソルト、は出力されない。) もらったファイルから key / iv を表示する場合
$ openssl enc -d -aes-128-cbc -in hoge.txt.enc -P
enter aes-128-cbc decryption password:
salt=E89360B042EFDBE0
key=35E38573AB84F2054BB8BCD8E5CD56EE
iv =382EA02910F2C2B5E2990846A30C169D
ソルトの部分を削れば復号できるのか。
$ dd if=hoge.txt.enc of=hoge.txt.enc.nosalt bs=1 skip=16
16+0 records in
16+0 records out
16 bytes transferred in 0.000732 secs (21860 bytes/sec)
$ hexdump -C hoge.txt.enc.nosalt 
00000000  65 f6 60 7a 8f f7 e3 21  a3 b2 dd a1 5c a7 dd be  |e.`z...!....\...|
00000010
$ openssl enc -d -aes-128-cbc -in hoge.txt.enc.nosalt -K 35E38573AB84F2054BB8BCD8E5CD56EE -iv 382EA02910F2C2B5E2990846A30C169D
$ openssl enc -d -aes-128-cbc -in hoge.txt.enc.nosalt -K 35E38573AB84F2054BB8BCD8E5CD56EE -iv 382EA02910F2C2B5E2990846A30C169D
hogehoge
Java Cipher を使って復号する場合
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding"); // openssl は PKCS5Padding で暗号化する
Key k = new SecretKeySpec(key, "AES"); // key は byte 配列
IvParameterSpec p = new IvParameterSpec(iv); // iv は byte 配列
c.init(Cipher.DECRYPT_MODE, k, p);
byte[] ret = c.doFinal(buf); // buf は byte 配列 (Salted__ソルトは削るか-nosaltで出力させない)
... 続きを読む

spring framework / spring security 4 reference

リファレンス

ネット検索で断片的な情報を参照するより、リファレンスを参照してアーキテクチャを理解するのがよいと思う。 spring framework 4 reference spring security 4 reference

サポート (EOL)

2020年までサポートされる 元記事

HOWTO

フォームを使わずに値のセットや値のチェックを(バリデーション)行う

リファレンス ここの例だと、propertyValues を target にセットする。その時、FooValidator が適用される。設定が必要だったかもしれない。 propertyValues は MutablePropertyValues のインスタンスなど。map などからインスタンス化できる。

オブジェクトのコピー

org.springframework.beans.BeanUtils の copyProperties 同名のプロパティ値(getter/setterを持ったメンバ変数?)を src から dst にコピー。このような便利なものがあるとは知らず、無駄にコピーしたり、プロパティ値が増えるとその度にコピーすることに・・・... 続きを読む

OpenJDK は使い物になるのか?

一部上場企業向けのアプリケーションで OpenJDK 1.8 (Linux) を使って構築して、日々使っていただいているので、問題なく使えるはずだ。Oracle JDK のベースは、OpenJDK だし、”sponsored and led by Oracle” であるし、RedHat の製品は OpenJDK での動作を保証しているので、問題ないはずだ。オープンソースにするということは、業界内で助け合おうということだと思うので、より安定して使えると私は信じている。 開発には、操作性などの都合、Windows を使うことも多いだろうが、Windows 用の OpenJDKを入れおくと良いだろう。... 続きを読む

pdf の上に pdf を重ねて出力

既出かもしれないが、面白いものを見つけたような気がする。 Apache PDFBox は良く知られていると思うが、その中のコマンドラインツール。 その中でも OverlayPDF は使えそうだと思ったので試してみた。PDF の上に別の PDF を重ねるということだろう。

手順

1.まず、以下のファイルを用意する。

pdfbox app jarファイル IPAフォント 他にも、java を実行できるよう、セットアップする。

2.ここでは例として、テキストから作った二つの PDF ファイルを重ねてみる。

uso.txt を作る。
これはうそです。
Mac は UTF-8 で OK。Windows は Shift-JIS? codepage による?

3.コマンドプロンプトから以下のコマンドで PDF を二つ作る。(> はプロンプト)

> java -jar pdfbox-app-2.0.7.jar TextToPDF -ttf IPAfont00303/ipagp.ttf uso1.pdf uso.txt
> java -jar pdfbox-app-2.0.7.jar TextToPDF -ttf IPAfont00303/ipamp.ttf -fontSize 30 uso2.pdf uso.txt
uso1.pdf と uso2.pdf ができているはずだ。

4.以下のコマンドを実行する。

> java -jar pdfbox-app-2.0.7.jar OverlayPDF uso1.pdf uso2.pdf uso_over_uso.pdf
どうだろう。二つの PDF が重なっているのではないだろうか。IPA フォントもなかなか良い。 うその上にうそを重ねた結果

その他の使い方

このコマンドラインツール、分割、結合もできて便利そうだ。 マージ “`java -jar pdfbox-app-2.y.z.jar PDFMerger 入力PDFファイル1 入力PDFファイル2 … 出力PDFファイル 分割 “`java -jar pdfbox-app-2.y.z.jar PDFSplit PDFファイル 画像変換 “`java -jar pdfbox-app-2.y.z.jar PDFToImage PDFファイル とするようだ。 既存の紙の帳票の上に印字するのに使えないだろうか・・・    ... 続きを読む

the trustAnchors parameter must be non-empty (centos 6.8 + tomcat 7 + openjdk 1.8)

ERROR on centos 6.8 + tomcat 7 + openjdk 1.8 com.amazonaws.AmazonClientException: Unable to execute HTTP request: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty   SOLUTION: update-ca-trust enable update-ca-trust extract (install_path)/catalina.sh restart     This worked for me. I would use the oracle jdk if it has longer EOL…  ... 続きを読む

開発/テスト/運用サイトで同じ war を使う

開発、テスト、運用で個別に war を作ったりしていて面倒だな、と思っていたら、stackoverflow に以下のような記事がありました。 http://stackoverflow.com/questions/7142365/how-to-provide-a-context-configuration-for-a-web-application-in-tomcat 使えるのかな?   jndi に関する記事 http://www.ibm.com/developerworks/jp/websphere/library/was/was_jndi/1.html... 続きを読む