ホームページ >Java >&#&チュートリアル >Javaの一方向暗号化の詳しい解説 - MD5、SHA、HMACと簡単な実装例コード
この記事では主にJavaの一方向暗号化の詳細な説明-MD5、SHA、HMACと簡単な実装例を紹介します。必要な方は参考にしてください
Javaの一方向暗号化の詳細な説明-MD5、SHA、HMAC。および簡単な実装例
概要:
MD5、SHA、および HMAC は、非可逆暗号化、つまり復号化できない暗号化方式として説明できる 3 つの暗号化アルゴリズムです。
MD5
MD5 は、完全かつ一貫した情報送信を保証するために使用されるメッセージ ダイジェスト アルゴリズム 5 (メッセージ ダイジェスト アルゴリズム 5) です。 MD5は、可変長の情報を入力し、128ビットの固定長を出力するアルゴリズムです。
MD5 アルゴリズムには次の特徴があります:
1. 圧縮性: 任意の長さのデータに対して、計算される MD5 値の長さは固定されます。
2. 計算が簡単: 元のデータから MD5 値を計算するのは簡単です。
3. 変更防止: 元のデータに変更が加えられた場合、たとえ 1 バイトだけ変更されたとしても、結果の MD5 値は大きく異なります。
4. 強力な衝突防止: 元のデータとその MD5 値がわかっていると、同じ MD5 値を持つデータ (つまり、偽造データ) を見つけるのは非常に困難です。
MD5 は、Unix などのオペレーティング システムのログイン認証、さまざまな BSD システムのログイン パスワード、デジタル署名、その他多くの側面でも広く使用されています。たとえば、Unix システムでは、ユーザーのパスワードは MD5 (または他の同様のアルゴリズム) を使用してハッシュ化された後、ファイル システムに保存されます。ユーザーがログインすると、システムはユーザーが入力したパスワードに対して MD5 ハッシュ操作を実行し、それをファイル システムに保存されている MD5 値と比較して、入力されたパスワードが正しいかどうかを判断します。このような手順を通じて、システムは、ユーザーのパスワードのクリア コードを知らなくても、ユーザーのシステムへのログインの正当性を判断できます。これにより、システム管理者権限を持つユーザーにユーザーのパスワードが知られるのを防ぎます。 MD5 は、任意の長さの「バイト文字列」を 128 ビットの大きな整数にマップします。この 128 ビットを通じて元の文字列を逆にすることは非常に困難です。
SHA
SHA (Secure Hash Algorithm、セキュアハッシュアルゴリズム)、デジタル署名、および暗号アプリケーションにおけるその他の重要なツールは、電子商取引などの情報セキュリティ分野で広く使用されています。 SHA と MD5 は両方とも衝突方式によって解読されていますが、SHA は依然として安全な暗号化アルゴリズムとして認識されており、MD5 よりも安全です。
SHAで定義されている長さ
下表のリレーハッシュ値(内部状態)は、各データブロックを圧縮しハッシュ化した後のリレー値(内部ハッシュ和)を表します。
アルゴリズム | 出力ハッシュ値長(ビット) | リレーハッシュ値長(ビット) | データブロック長(ビット) | 最大入力メッセージ長(ビット) | 1ワード長さ(ビット) | ループ数 | 使用オペレーター | 衝突攻撃 |
---|---|---|---|---|---|---|---|---|
160 | 160 | 512 | 264 − 1 | 80 | +、および、または、xor、rotl | is | ||
160 | 160 | 512 | 264 − 1 | 32 | 80 | +、および、or、rotl、 | 263 あります攻撃 | |
256/224 | 256 | 512 | 264 − 1 | 32 | 64 | +、and、or、xor、shr、rotr | は登場していませんまだ | |
512/384 | 512 | 1024 | 2128 − 1 | 64 | 80 | +、および、or、xor、shr、rotr | まだ登場していません |
HMAC
Java の例
package com.zzj.encryption; import java.security.MessageDigest; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * 单向加密(非可逆加密) * @author lenovo * */ public class OneWayEncryption { static final String ALGORITHM_MD5 = "MD5"; static final String ALGORITHM_SHA = "SHA"; /** * MAC算法可选以下多种算法 * <pre class="brush:php;toolbar:false"> * HmacMD5 * HmacSHA1 * HmacSHA256 * HmacSHA384 * HmacSHA512 **/ static final String ALGORITHM_MAC = "HmacMD5"; /** 密钥 **/ static final String MAC_KEY = "abcdef"; public static void main(String[] args) throws Exception { String source = "我是程序猿!我很骄傲!"; // MD5加密 printBase64(encryptionMD5(source)); // SHA加密 printBase64(encryptionSHA(source)); // HMAC加密 printBase64(encryptionHMAC(source)); } static void printBase64(byte[] out) throws Exception { System.out.println(encodeBase64(out)); } /** * MD5加密 * @param source * @return * @throws Exception */ static byte[] encryptionMD5(String source) throws Exception { MessageDigest md = MessageDigest.getInstance(ALGORITHM_MD5); md.update(source.getBytes("UTF-8")); return md.digest(); } /** * SHA加密 * @param source * @return * @throws Exception */ static byte[] encryptionSHA(String source) throws Exception { MessageDigest md = MessageDigest.getInstance(ALGORITHM_SHA); md.update(source.getBytes("UTF-8")); return md.digest(); } /** * HMAC加密 * @return * @throws Exception */ static byte[] encryptionHMAC(String source) throws Exception { SecretKey secretKey = new SecretKeySpec(MAC_KEY.getBytes("UTF-8"), ALGORITHM_MAC); Mac mac = Mac.getInstance(ALGORITHM_MAC); mac.init(secretKey); mac.update(source.getBytes("UTF-8")); return mac.doFinal(); } /** * base64编码 * @param source * @return * @throws Exception */ static String encodeBase64(byte[] source) throws Exception{ return new String(Base64.encodeBase64(source), "UTF-8"); } } 結果:
1cNbZhnhFsFV3BFPLA71wA== kl5KI61Xq44E/SzSPa2sUntMAEc= JF2v/u9td5l8yGAImNvTZw==
以上がJavaの一方向暗号化の詳しい解説 - MD5、SHA、HMACと簡単な実装例コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。