MD5暗号化の分析

MD5暗号化の概念

MD5暗号化は、一般的に使用される情報ダイジェストアルゴリズムであり、主にデータの整合性と署名の検証を保証するために使用され、不可逆的な暗号化アルゴリズムです。

MD5暗号化は、任意のバイト配列を32バイトのデータに暗号化することであり、32ビットの16進数として形式で表されます。

MD5暗号化の簡単な使用

JavaでのMD5暗号化の単純なアプリケーションを見てみましょう。

JavaはMD5暗号化を実現するのに役立ちました。それを実現するには、システム関数を呼び出すだけです。呼び出しシーケンスは次のとおりです。

最初のステップ

MD5暗号化オブジェクトを取得します。

try {
    messagedigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException nsaex) {
    System.err.println(MD5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");
    nsaex.printStackTrace();
}
第二段階

暗号化される受信データ:

byte[] secretBytes = messagedigest.digest(str.getBytes());

暗号化されたデータは、バッチで転送することもできます。

InputStream fis;
fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int numRead = 0;
while ((numRead = fis.read(buffer)) > 0) {
    messagedigest.update(buffer, 0, numRead);
}
fis.close();
byte[] secretBytes = messagedigest.digest();

返されるバイト配列は、長さ16の配列です。

第三段階

暗号化されたバイト配列を、通常目にするMD5暗号化に変換します。

protected static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};


private static String bufferToHex(byte bytes[], int m, int n) {
    StringBuffer stringbuffer = new StringBuffer(2 * n);
    int k = m + n;
    for (int l = m; l < k; l++) {
        appendHexPair(bytes[l], stringbuffer);
    }
    return stringbuffer.toString();
}

private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
    char c0 = hexDigits[(bt & 0xf0) >>> 4];// 取字节中高 4 位的数字转换
    char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
    stringbuffer.append(c0);
    stringbuffer.append(c1);
}

このようにして、暗号化された文字列が取得されます。

通常、バイトを暗号化された文字列に変換する別の方法があり、BigIntegerクラスを使用することに注意してください。

String md5code = new BigInteger(1, secretBytes).toString(16);

ただし、この書き方には問題があります。つまり、暗号化後の文字列の最上位桁が0の場合、省略されます。

String str = new BigInteger(1, new byte[]{0, 16}).toString(16);
System.out.println(str);
//输出10

したがって、BigIntegerを使用する正しい方法は次のとおりです。

String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
    md5code = "0" + md5code;
}

上記は、JavaでのMD5の単純な実装です。

MD5暗号化の実用的なシナリオ

MD5暗号化のアプリケーションシナリオを見てみましょう。

MD5は元に戻せないため、一部の暗号化された送信には適しておらず、反対側で復号化されます。主に、情報を隠してデータの整合性を確保するために使用されます。

以下に、MD5暗号化を使用するいくつかの特定のシナリオを示します。

ユーザーパスワード

ユーザーのパスワードは非常に機密性の高いデータであり、送信または保存するときにプレーンテキストで直接使用すると、セキュリティ上のリスクが隠されてしまいます。

たとえば、プレーンテキストはクライアント上にローカルに存在します。クライアントがrootによってクラックされた後、ファイルを直接取得してパスワードを見つけることができます。サーバーデータベース内のパスワードも、サーバーがクラックされた後にパスワードを取得するリスクがあり、バックグラウンド管理担当者がパスワードを見ることができます。送信の過程で、DNSハイジャックが発生した場合、パスワードも取得できます。

したがって、パスワードを送信して保存する場合は、MD5暗号化を使用することをお勧めし、クライアントとサーバーは暗号化された文字列を比較し、一致する場合はパスワードを検証します。

インターフェイスの署名

ネットワークインターフェイスが制限されていない場合、どちらの側もインターフェイスを呼び出していくつかのサービスを実装できるため、セキュリティリスクが高くなります。この状況を回避するために、インターフェイスに署名パラメータを追加することを選択できます。

たとえば、ネットワークインターフェイスhttps://wanandroid.com/wxarticle/chapters/jsonの場合、別の署名パラメーターサインを追加すると、彼の値は「満足」+フルパスMD5署名文字列になり、バックグラウンドで受信されます。要求後、署名を確認して、第三者からの悪意のある呼び出しを防止します。

ファイルの整合性チェック

転送プロセス中にファイルが破損しています。MD5を使用すると、ファイルの整合性を確認できます。

たとえば、クライアントが大きなファイルをダウンロードする場合、通常はブレークポイント継続メカニズムが使用されます。その場合、シナリオが必要になります。つまり、ファイルの一部がダウンロードされた後、ダウンロードが終了し、この期間中にサーバーのファイルが更新されます。クライアントがここでダウンロードすると、ダウンロードされたファイルに問題があるため、検証が実行されない場合はエラーが発生し、サーバーがファイルを送信すると、MD5値も送信され、クライアントはダウンロードします。ダウンロードしたファイルのMD5値とサーバーによって発行されたMD5値を確認した後、この状況を回避するために、ファイルを削除して再度ダウンロードします。

MD5暗号化のセキュリティとクラッキング

暗号化されたパスワードを例にとると、MD5暗号化は元に戻せず、暗号化された文字列間の類似性は元の文字列に関連しないため、暗号化された文字列の親密度を比較して元の文字列を修正することはできないため、MD5のクラッキングは一般にそれはブルートフォースクラッキングに基づいており、MD5暗号化の結果は16から32乗です。このような大量のデータをブルートフォースクラッキングしたい場合、現在のコンピューターはそれを行うことができないため、MD5のセキュリティは従来の意味で非常に高いです。

では、MD5パスワードクラッキングは現在市場でどのように人気がありますか?これは、ほとんどの人が設定するパスワードは比較的単純で、一般に純粋な数字または英語と数字などなので、ブルートフォースクラッキングの場合、段階的に試行せず、一般的なパスワードで直接暗号化して比較するためですクラックの目的を達成するために、計算の多くを減らすことができます。

この状況に対処し、ユーザーのパスワード情報を保護するために、ユーザーのパスワードにいくつかの一般的なプレフィックスとサフィックスを追加できます。たとえば、ユーザーはパスワードを123456に設定します。暗号化された文字列が取得されると、ライブラリによって簡単にヒットされます。クラック。ただし、プレフィックスサフィックスを手動で追加するには、abc123456xyzを使用します。これにより、クラックされる可能性ははるかに低くなります。

19件の元の記事を公開しました 賞賛されました8 訪問4041

おすすめ

転載: blog.csdn.net/u014068277/article/details/103115288