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

결론

암호화 알고리즘은 데이터의 기밀성을 보호하기 위해 사용되는 반면, 해시 함수는 데이터의 무결성을 검증하거나 비밀번호를 안전하게 보관하기 위해 사용됩니다. 이러한 차이점을 이해하고 데이터 보안에 적합한 방법을 선택하는 것이 중요합니다.

참고 문헌: