[java] 암호화 알고리즘과 해시 함수의 차이점
암호화 알고리즘과 해시 함수는 보안과 관련하여 사용되는 두 가지 주요한 개념입니다. 각각의 역할과 기능에 대해 살펴보고 두 개념의 차이점을 알아보겠습니다.
암호화 알고리즘
암호화 알고리즘은 데이터를 안전하게 전송하거나 저장하기 위해 사용됩니다. 암호화된 데이터는 키(key)를 필요로 하며, 이 키를 알고 있는 사람만이 데이터를 해독할 수 있습니다. 대칭키 암호화와 공개키 암호화가 가장 널리 사용되는 두 가지 유형의 암호화 알고리즘입니다.
대칭키 암호화
대칭키 암호화에서는 데이터를 암호화하고 해독하는 데 동일한 키를 사용합니다. 암호화된 데이터를 전송할 때 수신자에게 이 동일한 키를 안전하게 전달해야 합니다.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class SymmetricEncryption {
public static byte[] encryptData(byte[] inputData, SecretKey key) {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(inputData);
}
public static byte[] decryptData(byte[] inputData, SecretKey key) {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(inputData);
}
public static SecretKey generateKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256);
return keyGenerator.generateKey();
}
}
공개키 암호화
공개키 암호화는 공개키와 비밀키 두 가지 키를 사용합니다. 데이터를 암호화할 때는 공개키를 이용하고, 해당 데이터를 해독할 때는 비밀키를 사용합니다.
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class AsymmetricEncryption {
public static byte[] encryptData(byte[] inputData, PublicKey key) {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(inputData);
}
public static byte[] decryptData(byte[] inputData, PrivateKey key) {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(inputData);
}
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
}
해시 함수
해시 함수는 임의의 크기의 데이터를 고정된 크기의 데이터로 변환하는 함수입니다. 해시 함수를 통해 생성된 해시 값은 입력값이 같으면 항상 동일한 값을 가지며, 원본 데이터를 복원할 수 없습니다. 주로 데이터의 무결성을 검증하거나 비밀번호를 안전하게 저장할 때 사용됩니다.
import java.security.MessageDigest;
public class HashFunction {
public static byte[] generateHash(byte[] inputData) throws Exception {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
return digest.digest(inputData);
}
}
결론
암호화 알고리즘은 데이터의 기밀성을 보호하기 위해 사용되는 반면, 해시 함수는 데이터의 무결성을 검증하거나 비밀번호를 안전하게 보관하기 위해 사용됩니다. 이러한 차이점을 이해하고 데이터 보안에 적합한 방법을 선택하는 것이 중요합니다.
참고 문헌:
- Oracle Java Documentation: https://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html
- Baeldung - Guide to Java Cryptography: https://www.baeldung.com/java-cryptography