이 글에서는 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!