ホームページ >Java >&#&チュートリアル >Java MD5暗号化アルゴリズム
MD5 (Message Digest Algorithm 5)、メッセージ ダイジェスト アルゴリズムの第 5 版として翻訳されると、慣習に従って、MD2 や MD3 のような名前を持つ歴史的なバージョンも存在する可能性があると考えられます...
たとえそうでなかったとしても。このアルゴリズムの原理はまったく理解できません。名前からいくつかのヒントが得られます。いわゆる要約は、私が書いた卒業論文と同様に、短くて強力な要約です。実際、MD5 の役割は次のようになります。 MD5 アルゴリズムの機能を説明するテキストを見てみましょう。
MD5 の機能は、大容量の情報を保存できるようにすることです。機密形式に「圧縮」されます (つまり、デジタル署名ソフトウェアで秘密鍵に署名する前に)。これは主に整合性とセキュリティを確保するために使用されます。データ送信の一貫性
A が遠くにいる B に 100 万ワードのテキスト ファイルを送信したいとします。誰かがファイルの内容を途中で傍受して改ざんしても、ファイルがどれほど大きくても、MD5 によって暗号化された後は固定長の文字列 (通常は 32 ビット) が得られます。今回は、A が最初にファイルを MD5 で暗号化し、取得した暗号文の文字列も B に渡します。B がファイルを受信すると、ファイルも MD5 で暗号化し、取得した暗号文が A が送信した暗号文と一致するかどうかを確認します。一貫性がある場合は、ファイルが安全であることを意味します。これにより、データ送信の整合性が保証されます。実際、ファイルをダウンロードするときに、ダウンロードされたファイルの背後に MD5 暗号文が存在することがあります。 MD5 (e8027a87676ea48b3a3c9b0a4d8d87a0) などのファイル。この関数は、上で示した例と似ています (そう思います...)
MD5 は、暗号文を直接解読して取得する方法がないことを意味します。 MD5 は任意のサイズのファイルを暗号化し、一意の 32 ビット文字列を取得できます。
MD5 関数を簡単に理解すると、MD5 暗号化を実装するコードを直接確認できます。
コードをコピーします。パッケージ com.wang.encryption;
インポート com.sun.org.apache.xerces.internal.impl.dv.util.Base64;インポート java.security.MessageDigest; 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); }
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) となります。
extends MessageDigestSpi 此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。 MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。 对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,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't make digest of partial content");} 特定の実装がコピーできず、ダイジェストの数が事前にわかっている場合は、その後、複数のインスタンスをインスタンス化することで中間ダイジェストを計算することも可能です。 主なメソッドの機能は上記のコードのコメントに記載されているため、ここでは紹介しません MD5 の適用分野は主に次のカテゴリに分類できます。 1. 改ざんの防止。検証)、たとえば、ファイルのダウンロードを提供する場合、犯罪者がインストール プログラムにトロイの木馬を追加するのを防ぐために、インストール ファイルから取得した MD5 出力結果を Web サイトで公開できます。 2. プレーンテキストの直接閲覧を防止する (パスワード暗号化) 現在、多くの Web サイトでは、ユーザーのパスワードを保存するときに、ユーザーのパスワードの MD5 値がデータベースに保存されています。このようにして、犯罪者がデータベース内のユーザー パスワードの MD5 値を取得したとしても、ユーザーのパスワードを知ることはできません。 3. 否認の防止 (デジタル署名) たとえば、A がファイルを書き込み、認証局が MD5 アルゴリズムを使用してファイルの概要情報を生成し、記録を保存します。これにより、今後Aが事実を認めないことによるトラブルを防ぐことができます。
MD5 は不可逆的なアルゴリズムですが、解読できないというわけではありません。ほとんどのユーザーはパスワードを設定するときに、誕生日や略称などの特別な意味を持つフィールドを使用します。関連する情報を入力すると、パスワードを推測します。を使用して、MD5 で暗号化して大量の暗号文を取得し、パスワードの暗号文を取得して、私の暗号文ライブラリと 1 つずつ比較します。暗号文が一致する場合、パスワード自体は自滅します。