MySQLでパスワードを保存したかったので色々調べました。
どうもAES_ENCRYPT関数とAES_DECRYPT関数というのが安全性が高くていいらしい。
MySQL4.0.2以降で利用可能で、AES(Advanced Encryption Standard)アルゴリズムでデータの暗号化/解読を行うそうです。
以下にサンプルを記します。
[SQL]
INSERT INTO table VALUES (AES_ENCRYPT('text', 'key_string'))
textという文字列をkey_stringを使って暗号化してます。
複合化するときは以下のような感じ。
[SQL]
SELECT AES_DECRYPT(column_name, 'key_string') FROM table
column_nameに暗号化された情報が入っているとして、それをkey_stringで複合化してます。
暗号化と複合化に使うkey_stringは同じものを使うように。
それと自分がハマったんですが、暗号化された情報を入れるカラムの型はblob型です。
varchar型に入れようとすると、長さが短くなったよくわからない文字列が入り、複合化するとNULLが返ってきます。
ちなみにblob型の長さは、パスワードの文字数に1を足して16の倍数で切り上げた分だけ必要です。
例をあげると、12文字までのパスワードを受け付ける場合は16、24文字まで受け付ける場合は32にする必要があります。
バイナリで保存したくない場合は、HEX関数でHEXダンプするとvarchar型でも保存できるそうですが、まぁそういうこともできるんだよー、という紹介までに留めておきます。
どうもAES_ENCRYPT関数とAES_DECRYPT関数というのが安全性が高くていいらしい。
MySQL4.0.2以降で利用可能で、AES(Advanced Encryption Standard)アルゴリズムでデータの暗号化/解読を行うそうです。
以下にサンプルを記します。
[SQL]
INSERT INTO table VALUES (AES_ENCRYPT('text', 'key_string'))
textという文字列をkey_stringを使って暗号化してます。
複合化するときは以下のような感じ。
[SQL]
SELECT AES_DECRYPT(column_name, 'key_string') FROM table
column_nameに暗号化された情報が入っているとして、それをkey_stringで複合化してます。
暗号化と複合化に使うkey_stringは同じものを使うように。
それと自分がハマったんですが、暗号化された情報を入れるカラムの型はblob型です。
varchar型に入れようとすると、長さが短くなったよくわからない文字列が入り、複合化するとNULLが返ってきます。
ちなみにblob型の長さは、パスワードの文字数に1を足して16の倍数で切り上げた分だけ必要です。
例をあげると、12文字までのパスワードを受け付ける場合は16、24文字まで受け付ける場合は32にする必要があります。
バイナリで保存したくない場合は、HEX関数でHEXダンプするとvarchar型でも保存できるそうですが、まぁそういうこともできるんだよー、という紹介までに留めておきます。
PR
画像の表示方法には、imgタグを使用する方法とCSSを使用する方法があります。(他にもあります。)
で、「どっちの方法で表示すべき?」ってな感じで結構迷うことがあります。
こういうとき自分は、
1. 単純にテキストを画像化したもの
2. 地図や写真など画像でなければいけないもの
に分類して考えます。
1でよくあるのは、グローバルナビゲーションのボタンや、見出し部分ですよね。
こういうのをimg タグで実現してしまうと、「デザインのためにHTMLを使用」することになってしまうので、CSSで実現するほうがよいでしょう。
[HTML]
<h2><img src="midashi.jpg" alt="見出し"></h2>
よりも
[HTML]
<h2>見出し</h2>
[CSS]
h2 {
background: url("midashi_img.jpg") no-repeat;
height: 20px;
text-indent: -9999px;
width: 300px;
}
の方がGood!(プロパティの値は適当です。)
というわけで、HTMLについてなんか書かなければと思って書いたネタでした。。。
MySQLで、オートインクリメントを設定した主キーの値を、別のカラムでINSERT時に使用したい、という要件があったのですが、見事にハマりました(汗)
MySQLではINSERTするときに副問合せ(サブクエリ)に同一のテーブルを指定できないという制約があります。(さっき調べたところマニュアルに記述がありました。)
なので、オートインクリメントの値を使用したい場合、別のSQL文にするとかちょっとカッコ悪いことになってしまいます。
また、直接値を取りにいっても値は0になります。(オートインクリメントされる前なので当たり前といえば当たり前なんですけどね…。)
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', auto_increment_column);
ついでに、MAX関数で取得しようとすると、
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', max(auto_increment_column) + 1));
[結果]
「無効なグループ関数の使用」と言われてしまいます。
で、解決方法ですが、灯台下暗し。
『INSERT ~ SELECT』構文なるものがありました…valuesばっか使ってたので存在すら知らなかった。。。
『INSERT ~ SELECT』構文のマニュアル
dev.mysql.com/doc/refman/4.1/ja/insert-select.html
で、解法ですが、下記の通り。
[SQL]
INSERT INTO table_name ( text ) SELECT max(auto_increment_column) + 1 FROM table_name;
彷徨った果に見つけた下記のブログに感謝します。
このブログも誰かの助けになればよいのですが。
[参考文献]
oldblog.xenophy.com/index.php
MySQLではINSERTするときに副問合せ(サブクエリ)に同一のテーブルを指定できないという制約があります。(さっき調べたところマニュアルに記述がありました。)
なので、オートインクリメントの値を使用したい場合、別のSQL文にするとかちょっとカッコ悪いことになってしまいます。
また、直接値を取りにいっても値は0になります。(オートインクリメントされる前なので当たり前といえば当たり前なんですけどね…。)
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', auto_increment_column);
ついでに、MAX関数で取得しようとすると、
[SQL]
INSERT INTO table_name VALUES ('', 'hoge', max(auto_increment_column) + 1));
[結果]
#1111 - Invalid use of group function
「無効なグループ関数の使用」と言われてしまいます。
で、解決方法ですが、灯台下暗し。
『INSERT ~ SELECT』構文なるものがありました…valuesばっか使ってたので存在すら知らなかった。。。
『INSERT ~ SELECT』構文のマニュアル
dev.mysql.com/doc/refman/4.1/ja/insert-select.html
で、解法ですが、下記の通り。
[SQL]
INSERT INTO table_name ( text ) SELECT max(auto_increment_column) + 1 FROM table_name;
彷徨った果に見つけた下記のブログに感謝します。
このブログも誰かの助けになればよいのですが。
[参考文献]
oldblog.xenophy.com/index.php
ファイル名が被らないようにするために現在時刻を使用するとき、ミリ秒まで入れる方法をメモしておきます。
[式]
$hoge = date("YmdHis") . sprintf("%03d", (int)((float)microtime() * 1000));
ただし、ファイル名が被ってしまう確率は0にはならないので、「固有IDがふれない」かつ「まぁ被ってしまったらやり直してもらえばOK」なときだけ使用可能。
つまり、よっぽどぬるくないと使えません(笑)
むしろsprintf関数で「3」→「003」のように直してる部分の方がメモのし甲斐があるように思えます。
[式]
$hoge = date("YmdHis") . sprintf("%03d", (int)((float)microtime() * 1000));
ただし、ファイル名が被ってしまう確率は0にはならないので、「固有IDがふれない」かつ「まぁ被ってしまったらやり直してもらえばOK」なときだけ使用可能。
つまり、よっぽどぬるくないと使えません(笑)
むしろsprintf関数で「3」→「003」のように直してる部分の方がメモのし甲斐があるように思えます。
SSHトンネリングのメモです。
[Linuxのコマンド]
$ ssh -2 -C -N -f -L 1234:hostA:22 user@hostA
[オプション]
[-C] データを圧縮した通信を行う
[-N] リモートでコマンドを実行しない
[-f] バックグラウンドでプロセスとして実行
[-L] ローカルからリモート方向へのトンネリングを実現する。
[-2] プロトコルのバージョンを指定
いやー、自分で書いてても何がなんだか(笑)
今回は別サーバのDBを参照する必要があったので使用しました。
詳しいことは下記を参照してください。
[参考文献]
www.sb.soft.iwate-pu.ac.jp/~yushi/memo/ssh_port_forward.html
www.maruko2.com/index.php