java 字符串MD5的加密

简介

MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。


1 什么是MD5算法

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。

2 MD5功能

输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);

3 MD5不属于加密算法

认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有解密算法,所以这部分人认为MD5只能属于算法,不能称为加密算法;
认为属于的人是因为他们觉得经过MD5处理后看不到原文,即已经将原文加密,所以认为MD5属于加密算法;我个人支持前者,正如认为BASE64算法只能算编码一样。

4 MD5算法是不可逆

MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。

ただし、MD5には制限があり、元のテキストの数が無限にある可能性があるため、理論上、1つのMD5が実際に無限の数の元のテキストに対応する可能性があることを指摘しておく必要があります。たとえば、メインストリームMD5は、任意の長さの「バイト文字列を128ビット長整数にマップします。つまり、2 ^ 128の可能性があり、約3.4 * 10 ^ 38です。この数は制限されていますが、世界暗号化に使用できる元のテキストには、無数の可能性があります。

ただし、注意すべき点の1つは、これは可能な限り無限大への理論上の制限ですが、問題はこの無限大が実際には完全には確立されていないことです。これは、一方で、元のテキストの長さが実際に制限されることが多いためです(一般的に使用されるパスワードを使用するたとえば、ほとんどの人は20歳以内です。一方、2つの元のテキストが同じMD5(専門的な呼称、これはハッシュ衝突と呼ばれます)値に対応していることを見つけるのは非常に難しいので、ある意味で、特定の範囲内で構築したいと思いますMD5値と元のテキストの間の1対1の対応は完全に可能です。したがって、MD5の最も効果的な攻撃方法はレインボーテーブルです。詳細については、Googleで確認できます。

MD5はオーバーロス圧縮と同等です。

5 MD5使用

1.改ざんを防止するには:
1)たとえば、電子ドキュメントを送信するには、送信する前に、まずMD5出力結果を取得します。次に、相手が電子文書を受け取った後、相手もMD5出力結果を取得します。aがbと同じ場合は、改ざんされていないことを意味します。
2)たとえば、ファイルのダウンロードを提供する場合、犯罪者がインストールプログラムにトロイの木馬を追加するのを防ぐために、インストールファイルから取得したMD5出力結果をWebサイトに公開できます。
3)SVNは、チェックアウト後にファイルが変更されたかどうかを検出し、MD5も使用されます。

2.平文が直接表示されないようにする:
多くのWebサイトは、ユーザーのパスワードをデータベースに保存するときに、ユーザーのパスワードのMD5値を保存するようになりました。このようにして、犯罪者がデータベースでユーザーのパスワードのMD5値を取得したとしても、ユーザーのパスワードを知ることはできません。(たとえば、UNIXシステムでは、ユーザーのパスワードはMD5(または他の同様のアルゴリズム)で暗号化され、ファイルシステムに保存されます。ユーザーがログインすると、システムはユーザーがMD5値に入力したパスワードを計算し、それを保存します。ファイルシステムのMD5値は、入力されたパスワードが正しいかどうかを判断するために比較されます。この手順により、システムは、ユーザーパスワードの明確なコードを知らなくても、ユーザーのログインシステムの正当性を判断できます。これにより、ユーザーがシステムにログインできなくなるだけではありません。のパスワードはシステム管理者権限を持つユーザーに知られているため、パスワードの解読がある程度難しくなります。)

3.拒否の防止(デジタル署名):
これには、サードパーティの認証機関が必要です。たとえば、Aはファイルを書き込み、認証機関はMD5アルゴリズムを使用してこのファイルの概要情報を生成し、記録を作成します。Aが後でこのドキュメントが彼によって作成されたものではないと言った場合、当局はこのドキュメントの要約情報を再生成し、記録された要約情報と比較するだけで済みます。同じである場合、Aによって作成されたことを証明します。これは、いわゆる「デジタル署名」です。

6 MD5セキュリティ

総当たり攻撃の時間は一般の人々には受け入れられないため、MD5は非常に安全であると一般的に考えられています。実際、ユーザーのパスワードがMD5処理されてデータベースに格納されている場合、実際には非常に安全ではありません。ユーザーのパスワードは比較的短く、多くのユーザーのパスワードには誕生日、携帯電話番号、ID番号、電話番号などが使用されています。または、よく使われる縁起の良い数字や英語の単語を使用します。MD5で一般的に使用されるパスワードを最初に処理し、データを保存してから、MD5の結果と一致させると、プレーンテキストが取得される場合があります。たとえば、特定のMD5クラッキングWebサイト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;
    }
}

 

 

おすすめ

転載: blog.csdn.net/h4241778/article/details/108569022