JAva文字列MD 5の暗号化
概要
MD 5情報要約アルゴリズム(英語:MD 5 Message-Digest Algorithm)は、広く使用されている暗号ハッシュ関数であり、情報伝送の完全な一貫性を確保するために128ビット(16バイト)のハッシュ値(hash value)を生成することができる.MD 5はアメリカの暗号学者ロナルド・リービスター(Ronald Linn Rivest)によって設計され、1992年にMD 4アルゴリズムの代わりに公開された.このアルゴリズムのプログラムはRFC 1321規格で規格化されている.1996年以降、このアルゴリズムには弱点があることが確認され、解読することができ、高度な安全性を必要とするデータに対して、専門家は一般的にSHA-2のような他のアルゴリズムの変更を提案している.2004年、MD 5アルゴリズムは衝突を防止できないことが確認されたため、SSL公開鍵認証やデジタル署名などのセキュリティ認証には適用されなかった.
1 MD 5アルゴリズムとは
MD 5メッセージ要約演算アルゴリズム(英語:MD 5 Message-Digest Algorithm)は、広く使用されている暗号コンパクト関数であり、128ビット(16ビットメタグループ)のハッシュ値(hash value)を生成し、情報伝送が完全に一致することを確保することができる.
2 MD 5機能
任意の長さの情報を入力し、処理を経て128ビットの情報(デジタル指紋)を出力する.異なる入力で得られた異なる結果(一意性);
3 MD 5は暗号化アルゴリズムに属さない
属していないと考える人は、暗号文(ハッシュ値)から逆に原文を得ることができない、すなわち復号アルゴリズムがないと思っているため、MD 5はアルゴリズムに属し、暗号化アルゴリズムとは呼べないと考えている.属すると考える人は、MD 5処理後に原文が見えない、すなわち原文を暗号化したと思っているため、MD 5は暗号化アルゴリズムに属すると考えている.個人的には前者をサポートしていますが、BASE 64アルゴリズムは符号化しかできないと思っているように.
4 MD 5アルゴリズムは不可逆です
MD 5が不可逆的である理由は,hashアルゴリズムを用いたハッシュ関数であり,計算中に原文の一部の情報が失われたためである.
しかし、一つのMD 5は理論的に無数の原文に対応する可能性があることは指摘に値する.MD 5は限られた複数であり、原文は無数の複数であることができるからだ.例えば主流で使われているMD 5は、任意の長さの「バイト列」を128 bitの大きな整数にマッピングしています.つまり、2^128種類の可能性があり、3.4*10^38程度で、この数字は限られていますが、世界で暗号化できる原文は無数の可能性があります.
しかし、注意しなければならないのは、できるだけこれは理論的な有限対無限であるが、問題はこの無限が現実生活の中で完全に成立していないことである.現実の原文の長さは往々にして限られている(よく使われるパスワードを例にとると、一般の人は20位以内である)一方で、現在、2つの原文が同じMD 5に対応していることを発見したい.(専門的にはコンパクトインパクトと呼ばれています)値は非常に難しいので、ある意味ではMD 5値と原文の1つ1つの対応関係を一定の範囲で構築することは完全に可能です.MD 5に対して現在最も効果的な攻撃方法はレインボーテーブルで、具体的な詳細はグーグルで知ることができます.
MD 5は超損圧縮に相当する.
5 MD 5用途
1.改ざん防止:1)例えば、電子文書を送信し、送信する前に、まずMD 5の出力結果aを取得する.そして、相手が電子文書を受信すると、相手もMD 5の出力結果bを取得する.aがbと同じであれば、途中で改ざんされていないことを意味する.のMD 5出力結果.3)SVNは、CheckOut後にファイルが修正するか否かを検出するのにMD 5を用いた.
2.明文を直接見ないようにする:現在、多くのサイトでは、データベースにユーザーのパスワードを格納する際に、ユーザーのパスワードのMD 5値を格納している.これにより、不正分子がデータベースのユーザーパスワードのMD 5値を取得しても、ユーザーのパスワードを知ることができない.(例えば、UNIXシステムにおけるユーザーのパスワードはMD 5(または他の類似のアルゴリズム)暗号化されてファイルシステムに格納される.ユーザがログインすると、ユーザが入力したパスワードをMD 5値として算出し、ファイルシステムに格納されているMD 5値と比較して、入力したパスワードが正しいか否かを判定する.このような手順により、ユーザパスワードの明示コードが分からない場合に、ユーザログインシステムの正当性を判定することができる.ユーザーのパスワードがシステム管理者の権限を持つユーザーに知られることを避けるだけでなく、パスワードの解読の難しさもある程度増加します.
3.抵当防止(デジタル署名):サードパーティの認証機関が必要です.例えば、AはMD 5アルゴリズムで要約情報を生成して記録するファイルを書きました.後でAがこのファイルが彼が書いたものではないと言ったら、権威機関はこのファイルに要約情報を再生成して、記録されている要約情報と比較して、同じであれば、Aが書いたことを証明します.これはいわゆる「デジタル署名」.
6 MD 5セキュリティ
MD 5は安全だと言われていますが、暴力的に解読される時間は一般の人には受け入れられないからです.実際にユーザーのパスワードMD 5を処理してデータベースに保存するのは、実は安全ではありません.ユーザーのパスワードは短いので、多くのユーザーのパスワードは誕生日、携帯電話番号、身分証明書番号、電話番号などを使っています.あるいはよく使われるものを使っています縁起の良い数字、あるいはある英語の単語.もし私がよく使うパスワードを先にMD 5で処理して、データを保存して、それからあなたのMD 5の結果と一致したら、私は明文を得ることができます.例えば、あるMD 5がウェブサイトを解読します.http://www.cmd5.com/default.aspxしたがって、現在のほとんどのWebサイトのパスワードのポリシーは、ユーザーに数字の大文字と小文字の組み合わせを強制することです.ユーザーパスワードのセキュリティを向上させます.
7コード実装
MD 5情報要約アルゴリズム(英語:MD 5 Message-Digest Algorithm)は、広く使用されている暗号ハッシュ関数であり、情報伝送の完全な一貫性を確保するために128ビット(16バイト)のハッシュ値(hash value)を生成することができる.MD 5はアメリカの暗号学者ロナルド・リービスター(Ronald Linn Rivest)によって設計され、1992年にMD 4アルゴリズムの代わりに公開された.このアルゴリズムのプログラムはRFC 1321規格で規格化されている.1996年以降、このアルゴリズムには弱点があることが確認され、解読することができ、高度な安全性を必要とするデータに対して、専門家は一般的にSHA-2のような他のアルゴリズムの変更を提案している.2004年、MD 5アルゴリズムは衝突を防止できないことが確認されたため、SSL公開鍵認証やデジタル署名などのセキュリティ認証には適用されなかった.
1 MD 5アルゴリズムとは
MD 5メッセージ要約演算アルゴリズム(英語:MD 5 Message-Digest Algorithm)は、広く使用されている暗号コンパクト関数であり、128ビット(16ビットメタグループ)のハッシュ値(hash value)を生成し、情報伝送が完全に一致することを確保することができる.
2 MD 5機能
任意の長さの情報を入力し、処理を経て128ビットの情報(デジタル指紋)を出力する.異なる入力で得られた異なる結果(一意性);
3 MD 5は暗号化アルゴリズムに属さない
属していないと考える人は、暗号文(ハッシュ値)から逆に原文を得ることができない、すなわち復号アルゴリズムがないと思っているため、MD 5はアルゴリズムに属し、暗号化アルゴリズムとは呼べないと考えている.属すると考える人は、MD 5処理後に原文が見えない、すなわち原文を暗号化したと思っているため、MD 5は暗号化アルゴリズムに属すると考えている.個人的には前者をサポートしていますが、BASE 64アルゴリズムは符号化しかできないと思っているように.
4 MD 5アルゴリズムは不可逆です
MD 5が不可逆的である理由は,hashアルゴリズムを用いたハッシュ関数であり,計算中に原文の一部の情報が失われたためである.
しかし、一つのMD 5は理論的に無数の原文に対応する可能性があることは指摘に値する.MD 5は限られた複数であり、原文は無数の複数であることができるからだ.例えば主流で使われているMD 5は、任意の長さの「バイト列」を128 bitの大きな整数にマッピングしています.つまり、2^128種類の可能性があり、3.4*10^38程度で、この数字は限られていますが、世界で暗号化できる原文は無数の可能性があります.
しかし、注意しなければならないのは、できるだけこれは理論的な有限対無限であるが、問題はこの無限が現実生活の中で完全に成立していないことである.現実の原文の長さは往々にして限られている(よく使われるパスワードを例にとると、一般の人は20位以内である)一方で、現在、2つの原文が同じMD 5に対応していることを発見したい.(専門的にはコンパクトインパクトと呼ばれています)値は非常に難しいので、ある意味ではMD 5値と原文の1つ1つの対応関係を一定の範囲で構築することは完全に可能です.MD 5に対して現在最も効果的な攻撃方法はレインボーテーブルで、具体的な詳細はグーグルで知ることができます.
MD 5は超損圧縮に相当する.
5 MD 5用途
1.改ざん防止:1)例えば、電子文書を送信し、送信する前に、まずMD 5の出力結果aを取得する.そして、相手が電子文書を受信すると、相手もMD 5の出力結果bを取得する.aがbと同じであれば、途中で改ざんされていないことを意味する.のMD 5出力結果.3)SVNは、CheckOut後にファイルが修正するか否かを検出するのにMD 5を用いた.
2.明文を直接見ないようにする:現在、多くのサイトでは、データベースにユーザーのパスワードを格納する際に、ユーザーのパスワードのMD 5値を格納している.これにより、不正分子がデータベースのユーザーパスワードのMD 5値を取得しても、ユーザーのパスワードを知ることができない.(例えば、UNIXシステムにおけるユーザーのパスワードはMD 5(または他の類似のアルゴリズム)暗号化されてファイルシステムに格納される.ユーザがログインすると、ユーザが入力したパスワードをMD 5値として算出し、ファイルシステムに格納されているMD 5値と比較して、入力したパスワードが正しいか否かを判定する.このような手順により、ユーザパスワードの明示コードが分からない場合に、ユーザログインシステムの正当性を判定することができる.ユーザーのパスワードがシステム管理者の権限を持つユーザーに知られることを避けるだけでなく、パスワードの解読の難しさもある程度増加します.
3.抵当防止(デジタル署名):サードパーティの認証機関が必要です.例えば、AはMD 5アルゴリズムで要約情報を生成して記録するファイルを書きました.後でAがこのファイルが彼が書いたものではないと言ったら、権威機関はこのファイルに要約情報を再生成して、記録されている要約情報と比較して、同じであれば、Aが書いたことを証明します.これはいわゆる「デジタル署名」.
6 MD 5セキュリティ
MD 5は安全だと言われていますが、暴力的に解読される時間は一般の人には受け入れられないからです.実際にユーザーのパスワードMD 5を処理してデータベースに保存するのは、実は安全ではありません.ユーザーのパスワードは短いので、多くのユーザーのパスワードは誕生日、携帯電話番号、身分証明書番号、電話番号などを使っています.あるいはよく使われるものを使っています縁起の良い数字、あるいはある英語の単語.もし私がよく使うパスワードを先にMD 5で処理して、データを保存して、それからあなたのMD 5の結果と一致したら、私は明文を得ることができます.例えば、あるMD 5がウェブサイトを解読します.http://www.cmd5.com/default.aspxしたがって、現在のほとんどのWebサイトのパスワードのポリシーは、ユーザーに数字の大文字と小文字の組み合わせを強制することです.ユーザーパスワードのセキュリティを向上させます.
7コード実装
package xx.study.design.test;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5 {
public static void main(String[] args) {
System.out.println(MD5("hello md5"));
// :741fc6b1878e208346359af502dd11c5
}
/**
* Description MD5
*
* @param sourceStr
*/
private static String MD5(String sourceStr) {
String result = "";
try {
MessageDigest md = null;
md = MessageDigest.getInstance("MD5");
md.update(sourceStr.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
result = buf.toString();
} catch (NoSuchAlgorithmException e) {
// log.error(e.getMessage());
}
return result;
}
}