Java での MD5 と SHA ハッシュ

MD5 は、MIT 大学の Ronaled Rivest 教授によって開発された一連のアルゴリズムの 1 つです (Rivest、1994)。MD4 が安全でない可能性が高いことが研究で示されたとき、MD5 は MD4 を置き換えるように設計されました。MD4 の弱点は、後に Hans Dobbertin によって発見されました
SHA ハッシュ関数は、米国国家安全保障局 (NSA) によって設計されました。SHAはSecure Hash Algorithmの略です。3 つの SHA アルゴリズムは構造が異なり、SHA-0、SHA-1、および SHA-2 で区別されます。SHA-2 ファミリは、SHA-224、SHA-256、SHA-384、および SHA-512 によって区別される可変ダイジェストサイズを持つ同一のアルゴリズムを使用します.
このチュートリアルでは、MD5 と SHA-256 の 2 つのハッシュ方式を使用して、セキュリティ上の理由から文字列 (多くの場合はパスワード) をハッシュ化する方法を説明します。ハッシュ化は一方向のみでエンコードでき、これが最大の利点であるため、暗号化と復号化にキーを使用する暗号化とは異なり、ハッシュは元に戻せません。

MD5

この例では、MD5.

import java.security.MessageDigest;

public class md5_java
{
public static void main(String[] args)throws Exception
{
String password = "123456789";

MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());

バイト byteData[] = md.digest();

//ビット配列を16進数形式に変換 - method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println("ヘキサ形式: " + sb.toString());

//bitarray を 16 進数形式に変換する - method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;私は String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("ヘキサ形式: " + hexString.toString());
}
}
Output:

 
ヘキサ形式: 25f9e794323b453885f5181f1b624d0b
ヘキサ形式: 25f9e794323b453885f5181f1b624d0b

なぜMD5MD5のセキュリティは深刻に侵害されています。 その弱点が地上で悪用された。パスワードに MD5 を使用することは、安全な方法ではないため、お勧めできません。ユーザーパスワードなどの機密データには、常にSHAを使用してください.

import java.security.MessageDigest;

public class sha_java
{
public static void main(String[] args)throws Exception
{
String password = "123456789";

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(password.getBytes());

バイト byteData[] = md.digest();

//ビット配列を16進数形式に変換 - method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println("ヘキサ形式: " + sb.toString());

//bitarray を 16 進数形式に変換する - method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;私は String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("ヘキサ形式: " + hexString.toString());
}
}
出力:

 
ヘキサ形式: 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225
ヘキサ形式: 15e2b0d3c33891ebb0f1ef609ec419420c20e320ce94c65fbc8c3312448eb225

参照:
https://en.wikipedia.org/wiki/MD5
https://en.wikipedia.org/wiki/Secure_Hash_Algorithm
パスワードハッシュ関数としてのMD5の弱点?