>  기사  >  Java  >  단방향 암호화-MD5, SHA 및 HMAC에 대한 Java 자세한 설명 및 간단한 구현 예제 코드

단방향 암호화-MD5, SHA 및 HMAC에 대한 Java 자세한 설명 및 간단한 구현 예제 코드

黄舟
黄舟원래의
2017-03-08 10:46:021405검색

이 글에서는 주로 Java의 단방향 암호화(MD5, SHA, HMAC)에 대한 자세한 설명과 간단한 구현 예를 소개합니다.

Java의 단방향 암호화에 대한 자세한 설명-MD5를 참조하세요. , SHA 및 HMAC 및 간단한 구현 예

요약:

MD5, SHA 및 HMAC의 세 가지 암호화 알고리즘은 비가역 암호화라고 할 수 있습니다. 해독할 수 없는 암호화 방법.

MD5

MD5는 완전하고 일관된 정보 전송을 보장하기 위해 사용되는 Message-Digest Algorithm 5(Message-Digest Algorithm 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에서 정의한 길이

다음 표의 릴레이 해시 값(내부 상태)은 각 데이터 블록의 압축 해시를 나타냅니다. 릴레이 값( 내부 해시 합계).


算法 输出散列值长度(bits) 中继散列值长度(bits) 数据区块长度(bits) 最大输入消息长度(bits) 一个Word长度(bits) 循环次数 使用到的运算符 碰撞攻击
SHA-0 160 160 512 264 − 1 32 80 +,and,or,xor,rotl
SHA-1 160 160 512 264 − 1 32 80 +,and,or,xor,rotl 存在263的攻击
SHA-256/224 256/224 256 512 264 − 1 32 64 +,and,or,xor,shr,rotr 尚未出现
SHA-512/384 512/384 512 1024 2128 − 1 64 80 +,and,or,xor,shr,rotr 尚未出现

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"); } }

결과:

아아앙


위 내용은 단방향 암호화-MD5, SHA 및 HMAC에 대한 Java 자세한 설명 및 간단한 구현 예제 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.