データベースにパスワードを保存することは結構ある。
でも、そのまま保存していたらセキュリティ的に劇マズ。
なので暗号化したりするのですが、今回の仕事ではSHA-1というものを使用するとのことで調べてみた。
SHA-1(Secure Hash Algorithm 1)とは、IT用語辞典によると
認証やデジタル署名などに使われるハッシュ関数(要約関数)のひとつ。
2の64乗ビット以下の原文から160ビットの「ハッシュ値」を生成し、
通信経路の両端で比較することで、
通信途中で原文が改ざんされていないかを検出することができる。
計算方法には初期値敏感性の不可逆な一方向関数を含むため、
ハッシュ値は擬似的な乱数のような値をとり、
これをもとに原文を再現することはできない。
また、同じハッシュ値を生成する別のメッセージを作成することも極めて困難である。
1995年に米国標準技術局(NIST)によって
アメリカ政府の標準ハッシュ関数として採用された。
インターネット上で安全に通信を行なうためのIPsecなどに応用されている。e-Words
って、なんか破られていないか!?
すべてはここから始まった~SHA-1の脆弱化
まぁ、LAN内だけで使うのかもしれないからパッと見わかんなきゃいいだけかも知れないけど
で、結局どうやって実現するのかというと・・・
このページによると、
ハッシュ値はアルゴリズムを指定した MessageDigest にバイト配列を与えるだけで取得できます。
だそうです。
もう、デフォルトで用意されているみたい。
import java.security.MessageDigest;
public class Digest {
public void printDigest(byte[] digest) {
//ダイジェストを16進数で表示する
for (int i = 0; i < digest.length; i++) { int d = digest[i]; if (d < 0) { //byte型では128~255が負値になっているので補正 d += 256; } if (d < 16) { //0~15は16進数で1けたになるので、2けたになるよう頭に0を追加 System.out.print("0"); } System.out.print(Integer.toString(d, 16)); //ダイジェスト値の1バイトを16進数2けたで表示 } System.out.println(); } public byte[] getStringDigest(String data) throws Exception { //文字列からダイジェストを生成する MessageDigest md = MessageDigest.getInstance("SHA"); byte[] dat = data.getBytes(); md.update(dat); return md.digest(); } public static void main(String args[]) throws Exception { Digest d = new Digest(); d.printDigest(d.getStringDigest("変換したい文字")); } }
とりあえず、実行してみる。
暗号化はできたようだ。
で、これはVBではどうやるのだろうか?