play!frameworkで勝手にDBが更新された!
仕事でplay!frameworkを使っている。
2.Xはwarがうまく作れなかったので1.2.5を使うようになった。
非常に軽量なフレームワークで、作り始めるまでに数分。。
書き方も数日で覚えることができた
「こりゃ良いや!!」ってことでバリバリソースを書いていたのだが。。。
あるとき、ふとDBを見るとなんだか見慣れないテーブルが、、、
不思議に思いちょっと調べてみる。。
少し前に、テスト用に作ったModelがテーブル名称になっている
もしや!と思いModelを作ってみる
やはり。。
playはテスト環境にしていると
DBに見当たらないテーブル、フィールドを勝手に作ってしまうようだ
ドキュメントにしっかり書いてありました。。。
解決方法は
conf/application.conf内の
jpa.ddl=update
を
jpa.ddl=none
とするとテーブルは勝手に作られなくなる
おー怖い!きちんとドキュメントは読みましょう。。
CSS3を勉強したいなと思った
http://codepen.io/chinchang/pen/ygHBc
を見て、CSS3ってすごいなと。。
これだけでアニメーションとか作れたりするんだろうな。
上記サイトは自分でcssを修正して、動作を見れるので
とても勉強になりました。
ソース自体は結構簡単で短いのですが
アイデアというか、発想次第でいろいろ応用できそう!
今度、じっくり触ってみたいな。口だけになりそうだけど。。
javaでBlowfishを使う
仕事で暗号化を使う必要があったので
やった事をメモ
まず、Blowfishで暗号化する為に最初に決めないといけない事は
- 暗号化方式(CBC or EBC)
- パディング方式
- IV(初期ベクトル)
を決める事
暗号化方式
CBCとEBCというものがあるらしい。
ECB
初期ベクトルが固定で同じ文字を同じキーで暗号化した場合は同じ結果になる
CBC
暗号化する時に初期ベクトルがランダムで設定されるらしい
同じ文字を同じキーで暗号化しても毎回異なる結果になる
複合化する為には初期ベクトルが必要になる
※初期ベクトルについては後で書きます
パッディング方式
Blowfishでの暗号化は8byte単位でされるので、足りない場合は文字埋めされる
その方式がいろいろあるようなのでそれをここで指定する
PKCS5Padding
というのが主流らしい。
Javaのドキュメントもそうなっていたのでそうなんだろう
暗号化
例えば、暗号化される文字列が
=1234567890
KEY(秘密鍵)が
=testkey
だった場合
String algorithm = "Blowfish"; String mode = "Blowfish/CBC/PKCS5Padding"; String target = "1234567890"; String key = "testkey"; SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm); Cipher cipher = Cipher.getInstance(mode); cipher.init(Cipher.ENCRYPT_MODE, sksSpec); // 暗号化モード // 結果 System.out.println(cipher.doFinal(target.getBytes())); byte[] iv = cipher.getIV() // 実際に送る場合はBase64エンコードをする // Base64.encode(hogehoge.getBytes());
となる
初期ベクトルは
cipher.getIV();
で取得できる
ECBの場合はNULLみたい
**複合化
byte[] encrypted = Base64.decode(target); // BASE64エンコードされてい売る場合 byte[] ivByte = Base64.decode(iv); SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), algorithm); Cipher cipher = Cipher.getInstance(mode); // (1) IvParameterSpec ips = new IvParameterSpec(ivByte); cipher.init(Cipher.DECRYPT_MODE, sksSpec, ips); // 結果 System.out.println(cipher.doFinal(encrypted));
(1)でもらったIVで初期ベクトルを指定している
初期ベクトルがない場合は
cipher.init(Cipher.DECRYPT_MODE, sksSpec);
という呼び出しで複合化ができる
PHPとやり取りをする場合は↓こんな感じらしい。
http://d.hatena.ne.jp/pasela/20100612/crypto
今回は暗号化部分のみだったのであんまり見てません