パスワードのセキュリティ
webサイト構築の勉強中
パスワードを生でDBに保存していたんだけど、それはDBを見る人にすべてばれてしまい、セキュリティ的にすごくよろしくないということで、パスワードを暗号化してDBに保存することにした。
javaにもうパッケージがあるみたい…
import java.security.MessageDigest;
↑これ
暗号化のアルゴリズムは何個かあって
MD2, MD5, SHA, SHA-256, SHA-384, SHA-512
がある
SHA-1というのがあるけど、理論上破られるみたいなので、もう使わない方がよさそう。
以下、どっかからパクってきたソースコード。どこかわからなくなったので、とりあえずメモった
package javasource; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class passwordhash { /* メッセージダイジェストアルゴリズム */ public MessageDigest md = null; /* * テストコード */ public static void main(String[] args) { final String algorithmName = "SHA-256"; final String password = "p12345"; passwordhash e = new passwordhash(algorithmName); byte[] bytes = e.toHashValue(password); String result = e.toEncryptedString(bytes); System.out.println(result); // 出力→ f63e7ba71de88a877e320318d0112356c381276dc6b6a58381726bef4bbc1481 } /* * 引数でメッセージダイジェストアルゴリズムを指定する。 * MD2, MD5, SHA, SHA-256, SHA-384, SHA-512が利用可能。 */ public passwordhash(String algorithmName) { try { md = MessageDigest.getInstance(algorithmName); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /* * メッセージダイジェストアルゴリズムを使い、文字列をハッシュ値へ変換する。 */ public byte[] toHashValue(String password) { md.update(password.getBytes()); return md.digest(); } /* * バイト配列を16進数の文字列に変換し、連結して返す。 */ public String toEncryptedString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (byte b : bytes) { String hex = String.format("%02x", b); sb.append(hex); } return sb.toString(); } }
暗号化したパスワードは不可逆なので、もう元のパスワードには変換できない。
ログイン検証するときは、ユーザが入力したパスワードをもう一回上記アルゴリズムにかけて比べる感じ。