輸入java.io.UnsupportedEncodingException。
輸入java.security.MessageDigestの;
輸入java.security.NoSuchAlgorithmException。
インポートにjava.security.SecureRandom;
輸入java.util.Arrays。
インポートjava.util.Scanner;
パブリッククラスMD5 {
プライベート静的最終文字列HEX_NUMS_STR =「0123456789ABCDEF」。
= 12プライベート静的最終整数SALT_LENGTH。
/ **
*バイト配列16進文字列に変換
* @param六角
* @return
* /
パブリック静的バイト[] hexStringToByte(文字列六角){
INT LEN =(hex.length()/ 2)。
バイト[]結果=新しいバイト[LEN]。
CHAR [] hexChars = hex.toCharArray()。
以下のために(INT i = 0; iがLEN <; iは++){
int型のPOS =私は2 *;
結果[I] =(バイト)(HEX_NUMS_STR.indexOf(hexChars [POS])<< 4 | HEX_NUMS_STR.indexOf(hexChars [POS + 1]))。
}
結果を返します。
}
/ **
* 16進文字列に指定されたバイト配列に変換
* @param bの
* @return
* /
公共の静的な文字列byteToHexString(バイト[] B){
StringBufferのhexString =新しいStringBufferを();
以下のために(INT i = 0; iは<てb.length; iは++){
// 0XFFの小数255、Javaの0Xが使わ進文字に記載されており、現在のバイトを取って、この時間は反転を表し
ストリングヘクス= Integer.toHexString(B [i]が&0xFFで)。
IF(hex.length()== 1){
進= '0' +六角;
}
hexString.append(hex.toUpperCase())。
}
hexString.toStringを返します();
}
/ **
暗号化された文字列の後に得られた* 16進形式
* @paramパスワード
* @return
* @throws持つNoSuchAlgorithmException
* @throwsにUnsupportedEncodingException
* /
公共の静的な文字列getEncryptedPwd(文字列sourceString)
持つNoSuchAlgorithmException、にUnsupportedEncodingExceptionは{スロー
//配列変数暗号化されたパスワードを宣言
バイト[] PWD = NULL;
//乱数ジェネレータ
SecureRandomランダム=新しいのSecureRandom();
//宣言配列変数塩
バイト[]塩=新しいバイト[SALT_LENGTH]。
//変数塩に乱数
random.nextBytes(塩)。
//メッセージダイジェストオブジェクトを宣言
MessageDigest MD = NULL;
//メッセージダイジェストを作成します
MD = MessageDigest.getInstance( "MD5")。
//データ受信メッセージは、オブジェクト塩ダイジェスト
md.update(塩)。
ターゲットメッセージダイジェストに//パスワードデータ
md.update(sourceString.getBytes( "UTF-8"));
//バイト配列をメッセージダイジェストを取得
バイト[])(= md.digestを消化。
//塩のバイト配列がパスワードに格納されるので、バイト長を加えた塩
PWD =新しいバイト[digest.length + SALT_LENGTH]。
塩を摂取した場合、バイト配列の最初の12のバイトをコピーする//塩のバイトは、パスワード認証に暗号化されたパスワードを生成しました
System.arraycopyの(塩、0、PWD、0、SALT_LENGTH)。
//バイトのメッセージは暗号化されたパスワードは13バイト目からのスタートバイト配列にコピーされたダイジェスト
System.arraycopyの(0、PWD、SALT_LENGTH、digest.lengthダイジェスト)。
//バイト配列フォームを暗号化するためのパスワードは16進数の文字列形式のパスワードに変換されます。
byteToHexString(PWD)を返します。
}
/ **
*パスワードを確認することは正当です
* @paramパスワード
* @param passwordInDb
* @return
* @throws持つNoSuchAlgorithmException
* @throwsにUnsupportedEncodingException
* /
パブリック静的ブールvalidPassword(文字列sourceString、文字列md5String)
持つNoSuchAlgorithmException、にUnsupportedEncodingExceptionは{スロー
バイト配列にパスワードを変換する// 16進数の文字列形式
バイト[] pwdInDb = hexStringToByte(md5String)。
//変数塩を宣言
バイト[]塩=新しいバイト[SALT_LENGTH]。
//データベースから抽出されたバイト配列の塩からパスワードを保存
System.arraycopyの(pwdInDb、0、塩、0、SALT_LENGTH)。
//メッセージダイジェストオブジェクトを作成します
するMessageDigest MD = MessageDigest.getInstance( "MD5")。
//データ受信メッセージは、オブジェクト塩ダイジェスト
md.update(塩)。
ターゲットメッセージダイジェストに//パスワードデータ
md.update(sourceString.getBytes( "UTF-8"));
//パスワード生成されたメッセージダイジェスト
バイト[])(= md.digestを消化。
//データベースのパスワードのメッセージダイジェストを保持する変数を宣言
バイト[] digestInDb =新しいバイト[pwdInDb.length - SALT_LENGTH]。
//パスワードデータベースのメッセージダイジェストを取得
System.arraycopyの(pwdInDb、SALT_LENGTH、digestInDb、0、digestInDb.length)。
//同じパスワード生成したメッセージダイジェストと、メッセージに従って比較は、データベース内のダイジェストか否か
IF(をArrays.equals(digestInDbダイジェスト)){
//正しいパスワードは、パスワードのメッセージに一致返します
trueを返します。
}他{
//パスワードがメッセージに一致しない正しいパスワードを返しません
falseを返します。
}
}
パブリック静的無効メイン(文字列[] args){
System.out.println( "----------------- MD5暗号化開始--------------------");
{試します
System.out.print(「-----------------あなたが実行プレスの内容は、入力暗号化したい入力してください:」);
スキャナスキャナ=新しいスキャナ(System.in)。
ストリングsourceString = scanner.nextLine()。
ストリングmd5String = getEncryptedPwd(sourceString)。
System.out.println( "----------暗号化前:" + sourceString)。
System.out.println( "----------暗号化後:" + md5String)。
ブールfalg = validPassword(sourceString、md5String)。
System.out.println( "----------チェック入力文字列結果:" + falgを)。
}キャッチ(持つNoSuchAlgorithmException電子){
// TODO自動生成されたcatchブロック
e.printStackTrace();
}キャッチ(にUnsupportedEncodingException電子){
// TODO自動生成されたcatchブロック
e.printStackTrace();
}
System.out.println( "----------------- MD5暗号化エンド--------------------");
}
}