자바 암호 화 기술
복잡 한 대칭 암호 화(DES,PBE),비대 칭 암호 화 알고리즘:
● DES(데이터 암호 화 표준,데이터 암호 화 알고리즘) ● PBE(암호 기반 암호 화,암호 기반 인증) ● RSA(알고리즘 이름 은 발명자 의 이름 으로 Ron Rivest,AdiShamir 와 Leonard Adleman) ● DH(Diffie-Hellman 알고리즘,키 일치 프로 토 콜) ● DSA(디지털 서명 알고리즘,디지털 서명) ● ECC(Elliptic Curves Cryptography,타원 곡선 암호 코딩 학)
이 글 은 BASE 64,MD5,SHA,HMAC 의 몇 가지 방법 을 간략하게 소개 한다.
MD5,SHA,HMAC 라 는 세 가지 암호 화 알고리즘 은 역 암호 화 라 고 할 수 있 고 복호화 할 수 없 는 암호 화 방법 이다.우 리 는 보통 그들 을 암호 화의 기초 로 삼 는 다.단순 한 상기 세 가지 암호 화 는 믿 을 수 없다.
BASE64
RFC 2045 의 정의 에 따 르 면 Base 64 는 Base 64 콘 텐 츠 전송 인 코딩 으로 임 의 서열 의 8 비트 바이트 를 직접 식별 하기 어 려 운 형식 으로 묘사 하도록 설계 되 었 다.(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
메 일,http 암호 화 에서 흔히 볼 수 있 습 니 다.http 정 보 를 캡 처 하면 로그 인 작업 의 사용자 이름,비밀번호 필드 가 BASE 64 를 통 해 암호 화 된 것 을 발견 할 수 있 습 니 다.
자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**
* BASE64 http://www.bt285.cn http://www.5a520.cn
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/** *//**
* BASE64
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
주로 BASE 64Encoder,BASE 64Decoder 두 가지 유형 입 니 다.우 리 는 대응 하 는 방법 만 알 면 됩 니 다.또한 BASE 암호 화 후 생 성 되 는 바이트 의 자릿수 는 8 의 배수 이 며,만약 자릿수 가 부족 하면=기호 로 채 웁 니 다.
MD5
MD5-message-digest algorithm 5(정보-요약 알고리즘)의 줄 임 말로 암호 화 와 복호화 기술 에 광범 위 하 게 사용 되 며 파일 검사 에 자주 사용 된다.검사파일 이 아무리 크 더 라 도 MD5 를 거 친 후에 유일한 MD5 값 을 생 성 할 수 있 습 니 다.현재 ISO 검사 와 같이 모두 MD5 검사 입 니 다.어떻게?당연히 ISO 를 MD5 를 거 쳐 MD5 의 값 을 만들어 야 한다.일반적으로 linux-ISO 를 다운로드 하 는 친구 들 은 다운로드 링크 옆 에 MD5 꼬치 가 놓 여 있 는 것 을 본 적 이 있다.파일 이 일치 하 는 지 검증 하 는 데 쓰 인 다.
자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**
* MD5 http://www.bt285.cn http://www.5a520.cn
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptMD5(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);
return md5.digest();
}
일반적으로 우 리 는 상술 한 MD5 암호 화 를 직접 사용 하지 않 는 다.보통 MD5 에서 생 성 된 바이트 배열 을 BASE 64 에 건 네 주 고 암호 화하 여 해당 하 는 문자열 을 얻 습 니 다.
SHA
SHA(Secure Hash Algorithm,보안 해시 알고리즘),디지털 서명 등 암호학 응용 에서 중요 한 도구 로 전자상거래 등 정보 보안 분야 에 널리 활용 된다.비록 SHA 와 MD5 는 충돌 법 을 통 해 모두 풀 렸 지만 SHA 는 여전히 공 인 된 안전 암호 화 알고리즘 으로 MD5 보다 안전 하 다.
자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**
* SHA http://www.5a520.cn http://www.bt285.cn
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);
return sha.digest();
}
}
HMAC
HMAC(Hash Message Authentication Code,해시 메시지 감별 코드,키 기반 Hash 알고리즘 인증 프로 토 콜.메시지 감별 코드 가 감별 을 실현 하 는 원 리 는 공개 함수 와 키 로 고정된 길이 의 값 을 만들어 인증 표지 로 하고 이 표지 로 메시지 의 완전 성 을 감별 하 는 것 이다.키 를 사용 하여 고정 크기 의 작은 데이터 블록,즉 MAC 를 만 들 고 메시지 에 추가 한 다음 전송 합 니 다.수신 자 는 발송 자 와 공유 하 는 키 를 이용 하여 감별 인증 등 을 한다.
자바 코드 를 통 해 다음 과 같이 구현 합 니 다:
/** *//**
* HMAC http://www.guihua.org http://www.feng123.com
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}
/** *//**
* HMAC
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return mac.doFinal(data);
}
다음 과 같은 완전한 종 류 를 보 여 줍 니 다.
import java.security.MessageDigest;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/** *//**
* http://www.bt285.cn http://www.feng123.com
*
* @author
* @version 1.0
* @since 1.0
*/
public abstract class Coder {
public static final String KEY_SHA = "SHA";
public static final String KEY_MD5 = "MD5";
/** *//**
* MAC
*
* <pre>
* HmacMD5
* HmacSHA1
* HmacSHA256
* HmacSHA384
* HmacSHA512
* </pre>
*/
public static final String KEY_MAC = "HmacMD5";
/** *//**
* BASE64
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/** *//**
* BASE64
*
* @param key
* @return
* @throws Exception
*/
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
/** *//**
* MD5
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptMD5(byte[] data) throws Exception {
MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
md5.update(data);
return md5.digest();
}
/** *//**
* SHA
*
* @param data
* @return
* @throws Exception
*/
public static byte[] encryptSHA(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);
return sha.digest();
}
/** *//**
* HMAC
*
* @return
* @throws Exception
*/
public static String initMacKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
SecretKey secretKey = keyGenerator.generateKey();
return encryptBASE64(secretKey.getEncoded());
}
/** *//**
* HMAC
*
* @param data
* @param key
* @return
* @throws Exception
*/
public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
return mac.doFinal(data);
}
}
테스트 클래스 를 하나 더 드 립 니 다:
import static org.junit.Assert.*;
import org.junit.Test;
/**
*
* @author http://www.feng123.com
* @version 1.0
* @since 1.0
*/
public class CoderTest {
@Test
public void test() throws Exception {
String inputStr = " ";
System.err.println(" :
" + inputStr);
byte[] inputData = inputStr.getBytes();
String code = Coder.encryptBASE64(inputData);
System.err.println("BASE64 :
" + code);
byte[] output = Coder.decryptBASE64(code);
String outputStr = new String(output);
System.err.println("BASE64 :
" + outputStr);
// BASE64
assertEquals(inputStr, outputStr);
// MD5
assertArrayEquals(Coder.encryptMD5(inputData), Coder
.encryptMD5(inputData));
// SHA
assertArrayEquals(Coder.encryptSHA(inputData), Coder
.encryptSHA(inputData));
String key = Coder.initMacKey();
System.err.println("Mac :
" + key);
// HMAC ,
assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(
inputData, key));
BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
System.err.println("MD5:
" + md5.toString(16));
BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
System.err.println("SHA:
" + sha.toString(32));
BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
System.err.println("HMAC:
" + mac.toString(16));
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.