ホームページ  >  記事  >  Java  >  Javaの一方向暗号化の詳しい解説 - MD5、SHA、HMACと簡単な実装例コード

Javaの一方向暗号化の詳しい解説 - MD5、SHA、HMACと簡単な実装例コード

黄舟
黄舟オリジナル
2017-03-08 10:46:021405ブラウズ

この記事では主に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で定義されている長さ

下表のリレーハッシュ値(内部状態)は、各データブロックを圧縮しハッシュ化した後のリレー値(内部ハッシュ和)を表します。


SHA-0160160512264 − 180+、および、または、xor、rotlisSHA-1160160512264 − 13280+、および、or、rotl、 263 あります攻撃SHA-256/224256/224256512264 − 13264+、and、or、xor、shr、rotr は登場していませんまだSHA-512/384512/38451210242128 − 16480+、および、or、xor、shr、rotr まだ登場していません
アルゴリズム 出力ハッシュ値長(ビット) リレーハッシュ値長(ビット) データブロック長(ビット) 最大入力メッセージ長(ビット) 1ワード長さ(ビット) ループ数 使用オペレーター 衝突攻撃

HMAC

HMAC (ハッシュ メッセージ認証コード)、ハッシュ メッセージ認証コード、キーベースのハッシュ アルゴリズム認証プロトコル。メッセージ認証コードの原理は、公開関数とキーを使用して認証識別子として固定長の値を生成し、この識別子を使用してメッセージの完全性を認証することです。秘密キーを使用して、小さい固定サイズのデータ​​ ブロックである MAC が生成され、メッセージに追加されて送信されます。受信者は認証と認証に送信者と共有した鍵を使用します。

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 サイトの他の関連記事を参照してください。

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