ホームページ  >  記事  >  类库下载  >  Java MD5暗号化アルゴリズム

Java MD5暗号化アルゴリズム

高洛峰
高洛峰オリジナル
2016-11-05 10:18:211736ブラウズ

メッセージ ダイジェスト アルゴリズムの第 5 版と訳される MD5 (Message Digest Algorithm 5) は、慣例によれば、MD2 や MD3 のような名前を持つ歴史的なバージョンも存在する可能性があると考えられます...

そうでなくても。このアルゴリズムの原理はまったく理解できません。名前からいくつかのヒントが得られます。いわゆる要約は、私が書いた卒業論文と同様に、短くて強力な要約です。実際、MD5 の役割は次のようになります。 MD5 アルゴリズムの機能を説明するテキストを見てみましょう:

MD5 の機能は、大容量の情報を保存できるようにすることです。これは、主に整合性と一貫性を確保するために使用されます。

A が遠くにいる B に 100 万ワードのテキスト ファイルを送信したいとします。B がそのファイルを受信したとき、そのファイルが送信中に改ざんされたかどうかをどうやって知ることができるでしょうか。誰かがファイルの内容を途中で傍受して改ざんしても、ファイルのサイズに関係なく、MD5 が役に立ちます。現時点では、MD5 暗号化後に固定長の文字列が取得されます。 , Aは最初にファイルをMD5で暗号化し、取得した暗号文の文字列もBに渡します。Bがそれを受信すると、ファイルもMD5を使用してファイルを暗号化し、取得した暗号文がAが送信した暗号文と一致するかどうかを確認します。一貫性がある場合は、ファイルが安全であることを意味します。これにより、データ送信の整合性が保証されます。実際、インターネットからファイルをダウンロードする場合、ダウンロードしたファイルの背後に MD5 ( e8027a87676ea48b3a3c9b0a4d8d87a0) は、上で示した例と同様の機能を持っています (そう思います...)。


MD5 は公開された不可逆アルゴリズムです。つまり、暗号文を直接解読してソース データ情報を取得する方法はありません。 . MD5 は、任意のサイズのファイルを暗号化し、一意の 32 ビット文字列を取得できます。

MD5 の機能を簡単に理解した後、コードを直接確認できます

Java コードは MD5 暗号化を実装しています

package com.wang.encryption;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.MessageDigest;
/**
 * @author yogo.wang
 * @date 2016/11/04-下午1:02.
 */
public class MD5Test {
    public static String md5Encode(String msg) throws Exception{

        byte[] msgBytes = msg.getBytes("utf-8");
        /**
         * 声明使用Md5算法,获得MessaDigest对象
         */
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        /**
         * 使用指定的字节更新摘要
         */
        md5.update(msgBytes);
        /**
         * 完成哈希计算,获得密文
         */
        byte[] digest = md5.digest();
        /**
         * 以上两行代码等同于 byte[] digest = md5.digest(msgBytes);
         */
        return bytesToHexString(digest);
    }
    /**
     * 将byte数组转化为16进制字符串形式
     * @param bys
     * @return
     */
    public static String byteArr2hexString(byte[] bys){
        StringBuffer hexVal=new StringBuffer();
        int val=0;
        for (int i = 0; i < bys.length; i++) {
            //将byte转化为int  如果byte是一个负数就必须要和16进制的0xff做一次与运算
            val=((int)bys[i]) & 0xff;
            if(val<16){
                hexVal.append("0");
            }
            hexVal.append(Integer.toHexString(val));
        }

        return hexVal.toString();

    }

    public static void main(String[] args) throws Exception {
        String msg="helloworld";
        String result=md5Encode(msg);
        String result1=md5Encode(msg);
        System.out.println(result);
        System.out.println(result1);
    }

}

コードと出力結果は次のとおりです:

fc5e038d38a57032085441e7fe7010b0

fc5e038d38a570320 85441e7fe7010b0

同じフィールドが Encryption であることがわかり、取得された暗号文は常に一貫しています。 MD5実装の原理と応用を見てみる

MD5 の実装原理と応用

私はオンラインで何人かの友人が実装した md5 暗号化コードを読んだことがありますが、私はその半分しか知りません。そこで、いくつかの実装手順を紹介します。 MD5 アルゴリズムの原理は主に次のステップに分かれています。

1) 入力: まず、入力情報の長さ (ビット) が埋め込まれます。 512 は 448 に等しい。充填方法は、1 と n 個の 0 を充填することです。

2) レコード情報長: 埋める前の情報長を格納するために 64 ビットを使用します。この 64 ビットは最初のステップの結果の後に追加されるため、情報長は N*512+448+64=(N+1)*512 ビットになります。

3) 標準マジックナンバーをロードする: 標準マジックナンバーは (A=(01234567)16, B=(89ABCDEF)16, C=(FEDCBA98)16, D=(76543210)16) です。プログラムで定義する場合は、(A=0X67452301L、B=0XEFCDAB89L、C=0X98BADCFEL、D=0X10325476L) となります。


4) 4回のループ操作: ループ数はグループ数(N+1)です。



ここでは主に Java の MessageDigest クラスを紹介します。jdk 開発ドキュメントを確認すると、このクラスは java.security パッケージの下にあることがわかります。

public abstract class MessageDigest
    extends MessageDigestSpi


この MessageDigest クラスは、アプリケーションに MD5 アルゴリズムや SHA アルゴリズムなどのメッセージ ダイジェスト アルゴリズムの機能を提供します。メッセージ ダイジェストは、任意のサイズのデータ​​を受け入れ、固定長のハッシュ値を出力する安全な一方向ハッシュ関数です。


MessageDigest オブジェクトの初期化が開始されます。このオブジェクトは、update メソッドを使用してデータを処理します。ダイジェストは、reset メソッドを呼び出すことでいつでもリセットできます。更新する必要があるすべてのデータが更新されたら、ダイジェスト メソッドの 1 つを呼び出してハッシュ計算を完了する必要があります。


ダイジェスト メソッドは、一定量の更新データに対して 1 回だけ呼び出すことができます。ダイジェストが呼び出された後、MessageDigest オブジェクトは初期状態にリセットされます。

実装者は、Cloneable インターフェースを実装するかどうかを自由に選択できます。クライアント アプリケーションは、コピーを試みて CloneNotSupportedException をキャッチすることで再現性をテストできます:


 MessageDigest md = MessageDigest.getInstance("SHA");
 try {
     md.update(toChapter1);
     MessageDigest tc1 = md.clone();
     byte[] toChapter1Digest = tc1.digest();
     md.update(toChapter2);
     ...etc.
 } catch (CloneNotSupportedException cnse) {
     throw new DigestException("couldn&#39;t make digest of partial content");
 }

特定の実装が再現できず、ダイジェストの数が事前にわかっている場合でも、複数のインスタンスをインスタンス化することで計算できることに注意してください。 。

主なメソッドの機能は上記コードのコメントに記載されているのでここでは紹介しません


MD5の応用分野は主に以下のカテゴリに分類できます:


。 1. 改ざんの防止 (ファイルの完全性検証)。たとえば、ファイルのダウンロードを提供する場合、犯罪者がインストール プログラムにトロイの木馬を追加するのを防ぐために、インストール ファイルから取得した MD5 出力結果を Web サイトで公開できます。

2. プレーンテキストの直接閲覧を防止します (パスワード暗号化)。 現在、多くの Web サイトでは、ユーザーのパスワードを保存するときに、ユーザーのパスワードの MD5 値がデータベースに保存されています。このようにして、犯罪者がデータベース内のユーザー パスワードの MD5 値を取得したとしても、ユーザーのパスワードを知ることはできません。

3. 否認の防止 (デジタル署名) たとえば、A がファイルを書き込み、認証局が MD5 アルゴリズムを使用してファイルの概要情報を生成し、記録を保持します。これにより、今後Aが事実を認めないことによるトラブルを防ぐことができます。

MD5 は不可逆的なアルゴリズムですが、解読できないというわけではありません。ほとんどのユーザーはパスワードを設定するときに、誕生日や略称などの特別な意味を持つフィールドを使用します。関連する情報を入力すると、次のようになります。使用できるパスワードをすべて MD5 で暗号化して大量の暗号文を取得し、パスワードの暗号文を取得して、私の暗号文ライブラリと 1 つずつ比較します。暗号文が一致する場合、パスワード自体が暗号化されます。同様に、多くの Web サイトでは、MD5 パスワード値を入力した後、その値がデータベースに存在する場合、同じ原理が適用されます。たとえば、上記のコードでは、文字列「helloworld」を MD5 で暗号化しました。理論的には、暗号文だけを知っていて、元のデータを解読することは不可能ですが、実際にはそうなのか見てみましょう。 Web サイト http://pmd5.com/

Java MD5暗号化アルゴリズム

上記のコードで生成された暗号文を入力すると、Web サイトはすぐに解読されました。原理は非常に簡単です。

MD5 の詳細 詳細なテキスト情報については、 Baidu Encyclopedia にアクセスしてください。紹介は非常に詳細であり、読む価値があります


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。