π RSA(Rivest-Shamir-Adleman)λ?
- μνΈνμ 보μ λΆμΌμμ λ리 μ¬μ©λλ 곡κ°ν€ μνΈν μκ³ λ¦¬μ¦μ΄λ€.
π μμ μ±κ³Ό νμ©
- RSAμ μμ μ±μ ν° μ μ μΈμλΆν΄ λ¬Έμ μ κΈ°λ°νλ€.
- λ°μ΄ν° 보μλΏλ§ μλλΌ μΈμ¦κ³Ό λμ§νΈ μλͺ λ± λ€μν 보μ μμ© λΆμΌμμ νμ©λλ€.
- νμ¬κΉμ§λ λ리 μ¬μ©λλ©° μ€μνμμ λ§μ΄ μ νλ 보μ νλ‘μΈμ€ μ€ νλμ΄λ€.
π 곡κ°ν€μ κ°μΈν€
- RSAλ 곡κ°ν€μ κ°μΈν€λΌλ λ κ°μ§ ν€λ₯Ό μ¬μ©νλ€.
- λ ν€λ₯Ό μ΄μ©ν΄ μ μμλͺ κ³Ό μνΈνλ₯Ό ꡬνν μ μλ€.
- λ ν€λ μλ‘ νμ΄(μ§)λ₯Ό μ΄λ£¬λ€.
- 곡κ°ν€λ λꡬμκ²λ μ€ννλ ν€μ΄λ€.
- 곡κ°ν€λ‘ μνΈνλ λ°μ΄ν°λ κ°μΈν€λ‘λ§ ν΄λ ν μ μλ€.
- κ°μΈν€λ ν€λ₯Ό μμ±ν κ°μΈλ§μ΄ κ°μ§κ³ μλ ν€μ΄λ©° μΈλΆμ μ λ λ
ΈμΆλμ΄μλ μ λλ€.
- κ°μΈν€λ‘ μλͺ λ λ°μ΄ν°λ 곡κ°ν€λ‘λ§ ν΄λ ν μ μλ€.
π ν€ μμ±
- RSA ν€ νμ΄(곡κ°ν€-κ°μΈν€ μ)λ₯Ό μμ±νκΈ° μν΄μλ μμ(p, q) μ νκ³Ό κ΄λ ¨λ μ°μ°μ΄ νμνλ€.
- pμ qλ₯Ό μ ννκ³ , μ΄λ€μ λ°νμΌλ‘ 곡κ°ν€(e, n)μ κ°μΈν€(d, n)λ₯Ό κ³μ°νλ λ°©μμΌλ‘ λ§λ€μ΄μ§λ€.
- μμΈν 건 ꡬκΈλ§μ ν΅ν΄ μμ보μ π
π RSA μ μμλͺ μ μμλ‘ μ΄ν΄νκΈ°
- μ μμλͺ μμ μλͺ μ΄λ μνΈννλ€λ λ§κ³Ό κ°λ€.
- μ² μλ RSA λ°©μμ 곡κ°ν€μ κ°μΈν€λ₯Ό λ§λ€μλ€.
- μ² μλ λ°μ΄ν°λ₯Ό μμ μ κ°μΈν€λ‘ μλͺ (μνΈν)νλ€.
- μ² μλ μν¬μκ² <μμ μ 곡κ°ν€>μ, <μμ μ κ°μΈν€λ‘ μνΈνλ λ°μ΄ν°>λ₯Ό μ£Όμλ€.
- μν¬λ <μ² μμ 곡κ°ν€>μ, <μ² μμ κ°μΈν€λ‘ μνΈν λ λ°μ΄ν°>λ₯Ό λ°μλ€.
- μν¬λ <μ² μμ 곡κ°ν€>λ‘ <μνΈνλ λ°μ΄ν°>λ₯Ό 볡νΈνν¨μΌλ‘μ¨ μ² μκ° ν΄λΉ λ°μ΄ν°λ₯Ό λ§λ€μμμ μ λ’°ν μ μλ€.
- μ² μμ 곡κ°ν€λ‘ 볡νΈνλμλ€λ μ΄μΌκΈ°λ ν΄λΉ λ°μ΄ν°κ° μ² μμ κ°μΈν€λ‘ μνΈνλμλ€λ μ΄μΌκΈ°μ΄λ€.
- μ² μλ§μ΄ κ°μ§κ³ μλ κ°μΈν€λ‘ μνΈνλμμΌλ―λ‘ μ² μμ λ°μ΄ν°μμ μ λ’°ν μ μλ κ²μ΄λ€.
π‘ μ μμλͺ μ μ΄μ
- 무결μ±: μλͺ λ λ°μ΄ν°κ° λ³κ²½λμ§ μμμμ κ²μ¦ν μ μλ€.
- μΈμ¦: μλͺ μ΄ μ ν¨ν κ²½μ°, ν΄λΉ λ°μ΄ν°λ₯Ό μμ±ν μ¬λ(μ² μ)μμ νμΈν μ μλ€.
- λΆμΈ λ°©μ§: μ² μλ§μ΄ μμ μ κ°μΈν€λ‘ μλͺ ν μ μμΌλ―λ‘, λμ€μ λΆμ νκ±°λ λΆμΈνλ κ²μ΄ μ΄λ €μμ§λ€.
π RSA μνΈνλ₯Ό μμλ‘ μ΄ν΄νκΈ°
- μν¬λ λμΉν€λ₯Ό μμ±νλ€.
- μν¬λ <μ² μμ 곡κ°ν€>λ‘ <λμΉν€>λ₯Ό μνΈννμ¬ μ² μμκ² λ³΄λλ€.
- ν΄λΉ λ°μ΄ν°λ μ² μμ κ°μΈν€λ‘λ§ λ³΅νΈνκ° κ°λ₯νλ―λ‘ μ² μλ§μ΄ μμ μ κ°μΈν€λ‘ μ΄ μ μλ€.
- μ² μλ μμ μ κ°μΈν€λ‘ μν¬μκ² λ°μ λ°μ΄ν°λ₯Ό 볡νΈννλ€.
- 볡νΈνν λ°μ΄ν°λ μν¬κ° λ§λ λμΉν€μ΄λ―λ‘ μ΄ν μ² μμ μν¬λ ν΄λΉ λμΉν€λ‘ μμ νκ² λ°μ΄ν°λ₯Ό μ볡νΈννμ¬ μ£Όκ³ λ°μ μ μκ² λμλ€.
π μλ°μμ RSA ν€ μμ±νκΈ°
// RSA μμ±
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class RsaGenerator {
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
// 1. νμ¬ μκ°μ μ΄μ©νμ¬ seed κ°μ μμ±ν©λλ€.
String key = String.valueOf(System.currentTimeMillis());
// 2. SecureRandom κ°μ²΄λ₯Ό μμ±νκ³ seed κ°μ μ μ©ν©λλ€.
SecureRandom random = new SecureRandom(key.getBytes());
// 3. KeyPairGenerator κ°μ²΄λ₯Ό μμ±νκ³ RSA μκ³ λ¦¬μ¦μ μ¬μ©νμ¬ μ΄κΈ°νν©λλ€.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
// 4. ν€μμ μ΄κΈ°ν μ€μ μ (keySize : 2048, μμμ μ€μ ν λλ€ seed κ°)μΌλ‘ ν©λλ€.
keyGen.initialize(2048, random);
// 5. KeyPairGeneratorλ₯Ό μ¬μ©νμ¬ κ³΅κ°ν€μ κ°μΈν€μ μμΈ KeyPairλ₯Ό μμ±ν©λλ€.
return keyGen.generateKeyPair();
}
}
// μ¬μ© μμ(Base64λ‘ μΈμ½λ©)
public class test {
public void testMethod() {
String publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
String secretKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
...
}
}
- Javaμμλ Rsa ν€ μμ λ§λ€ μ μλ ν΄λμ€λ₯Ό μ§μνλ€.
- 1 , 2λ²μ ν€μμ λ§λ€κΈ° μν΄ μ¬μ©νλ λμλ₯Ό μμ±νλ κ³Όμ μ΄λ€.
- 3λ²μ KeyPairGeneratorλΌλ κ°μ²΄λ₯Ό μμ±νκ³ μκ³ λ¦¬μ¦μ RSAλ‘ μ¬μ©νμ¬ μ΄κΈ°ννλ€.
- 4λ²μμ initialize λ©μλμ νλΌλ―Έν° κ°μ (int keysize, SecureRandom random)μ΄λ€.
- μμΈν λ΄μ©μ μλμ KeyPairGenerator ν΄λμ€μμ μ€λͺ νλ€.
- μ¬μ© μμμμ μμ±λ ν€ νμ΄λ₯Ό Base64λ₯Ό μ΄μ©ν΄ μΈμ½λ©νμ¬ λ¬Έμμ΄ νμ μΌλ‘ ν€λ₯Ό μμ±νκ³ μμμ νμΈν μ μλ€.
- λ¬Όλ‘ Hex λ±μΌλ‘ λ³ννμ¬ μ¬μ©νλ κ²λ κ°λ₯νλ€.
π KeyPairGenerator ν΄λμ€
/**
* Initializes the key pair generator for a certain keysize using
* a default parameter set and the {@code SecureRandom}
* implementation of the highest-priority installed provider as the source
* of randomness.
* (If none of the installed providers supply an implementation of
* {@code SecureRandom}, a system-provided source of randomness is
* used.)
*
* @param keysize the keysize. This is an
* algorithm-specific metric, such as modulus length, specified in
* number of bits.
*
* @throws InvalidParameterException if the {@code keysize} is not
* supported by this KeyPairGenerator object.
*/
public void initialize(int keysize) {
initialize(keysize, JCAUtil.getDefSecureRandom());
}
/**
* Initializes the key pair generator for a certain keysize with
* the given source of randomness (and a default parameter set).
*
* @param keysize the keysize. This is an
* algorithm-specific metric, such as modulus length, specified in
* number of bits.
* @param random the source of randomness.
*
* @throws InvalidParameterException if the {@code keysize} is not
* supported by this KeyPairGenerator object.
*
* @since 1.2
*/
public void initialize(int keysize, SecureRandom random) {
// This does nothing, because either
// 1. the implementation object returned by getInstance() is an
// instance of KeyPairGenerator which has its own
// initialize(keysize, random) method, so the application would
// be calling that method directly, or
// 2. the implementation returned by getInstance() is an instance
// of Delegate, in which case initialize(keysize, random) is
// overridden to call the corresponding SPI method.
// (This is a special case, because the API and SPI method have the
// same name.)
}
- initialize λ©μλλ μ€λ²λ‘λ©λ μ¬λ¬ λ©μλκ° μ‘΄μ¬νλ€.
- λμλ₯Ό μ€μ νμ§ μλ κ²½μ° JCAUtil.getDefSecureRandom() μ체μ μΌλ‘ λμλ₯Ό μμ±ν¨μ νμΈν μ μλ€.
- π€ RSAμ ν€ μ¬μ΄μ¦λ μ΄λ μ λκ° μ λΉ ν μ§μ λν λ€ΌνΌμ λ΅λ³
- RSA ν€ ν¬κΈ°λ μνΈνμμ μ¬μ©λλ λͺ¨λλ¬μ€(modulus)μ κΈΈμ΄λ₯Ό λνλ λλ€. μΌλ°μ μΌλ‘ RSA ν€ ν¬κΈ°λ λΉνΈ λ¨μλ‘ ννλ©λλ€. λ ν° ν€ ν¬κΈ°λ λ κ°λ ₯ν 보μμ μ 곡νμ§λ§ κ³μ° λΉμ©μ΄ μ¦κ°νλ―λ‘ μν©μ λ§κ² μ μ ν ν€ ν¬κΈ°λ₯Ό μ νν΄μΌ ν©λλ€.
- 1024λΉνΈ μ΄ν
- κ³Όκ±°μ λ리 μ¬μ©λμμΌλ, νμ¬λ κΆμ₯λμ§ μμ΅λλ€.
- μνΈ λΆμ κΈ°μ μ λ°μ μΌλ‘ μΈν΄ μμ μ±μ΄ μ νλμμ΅λλ€.
- νμ¬ λ³΄μ μꡬμ¬νμ μΆ©μ‘±νμ§ λͺ»ν μ μμΌλ―λ‘ κΆμ₯νμ§ μμ΅λλ€.
- 2048λΉνΈ
- νμ¬ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ RSA ν€ ν¬κΈ°μ λλ€.
- μΆ©λΆν μμ νλ©΄μλ κ³μ° λΉμ©μ΄ μ λΉν©λλ€.
- λλΆλΆμ 보μ μμ© νλ‘κ·Έλ¨μμ κΆμ₯νλ κΈ°λ³Έ κ°μ λλ€.
- 3072λΉνΈ μ΄μ
- λ κ°λ ₯ν 보μμ μꡬνλ κ²½μ° μ νν μ μλ μ΅μ μ λλ€.
- μλ₯Ό λ€μ΄, μ λΆ κΈ°κ΄, κΈμ΅ κΈ°κ΄ λ±μμ λ―Όκ°ν μ 보λ₯Ό μ²λ¦¬νλ κ²½μ°μ μ¬μ©λ μ μμ΅λλ€.
- νμ§λ§ κ³μ° λΉμ©μ΄ μ¦κ°νλ―λ‘ μ±λ₯κ³Ό 보μ μ¬μ΄μ κ· νμ κ³ λ €ν΄μΌ ν©λλ€.
- 4096λΉνΈ μ΄μ
- λ§€μ° κ°λ ₯ν 보μμ μ 곡νμ§λ§, κ³μ° λΉμ©μ΄ λ§μ΄ λλλ€.
- μ£Όλ‘ μ΅κ³ μμ€μ 보μ μꡬμ¬νμ μΆ©μ‘±ν΄μΌ νλ νκ²½μμ μ νλ©λλ€.
π RSA μ μμλͺ μ볡νΈν ν μ€νΈ
π μνΈν ν΄λμ€
public class RsaGenerator {
public static String encrypt(String data, String privateKeyStr) {
try {
// [1] Base64λ‘ μΈμ½λ©λ κ°μΈ ν€λ₯Ό PrivateKey κ°μ²΄λ‘ λ³νν©λλ€.
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// [2] RSA μνΈν λ°©μμ μ€μ νλ€.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
// [3]
byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedData);
} catch (Exception e) {
throw new RuntimeException(e); // νμμ λ°λΌ μμΈ μ²λ¦¬λ₯Ό ν©λλ€
}
}
}
- μ μνΈν ν΄λμ€μμλ λ¬Έμμ΄ λ°μ΄ν°μ, κ°μΈν€λ₯Ό νλΌλ―Έν°λ‘ λ°μ μνΈννλ€.
- κ°μΈν€λ‘ μνΈν(μλͺ )νκ³ κ³΅κ°ν€λ‘ 볡νΈννλ μ μμλͺ ν μ€νΈμ΄λ€.
- [1]μμλ Base64λ‘ μΈμ½λ© λ κ°μΈν€λ₯Ό PrivateKey κ°μ²΄λ‘ λ³ννλ€.
- μμ ν€ μμ± μμ μμ κ°μΈν€λ₯Ό Base64λ‘ μΈμ½λ©νμ¬ String νμ μΌλ‘ λ³ννκΈ° λλ¬Έμ μμΌλ‘ Base64λ‘ λμ½λ©νμ¬ PrivateKey νμ μΌλ‘ λ³ννλ κ²μ΄λ€.
- λ§μ½ Hexλ‘ μΈμ½λ©ν String νμ μ ν€λ₯Ό κ°μ§κ³ μλ€λ©΄ Hexλ‘ λμ½λ©νμ¬μΌ νλ€.
- λ μ°¨μ΄λ₯Ό λͺ¨λ₯΄κ² λ€λ©΄ μ΄ κΈμ μ°Έκ³ νμ.
- String νμ μ κ°μΈν€λ₯Ό PrivaveKey νμ μΌλ‘ λ³ννλ κ²½μ° PKCS8EncodedKeySpec κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ νλ€.
- KeyFactory κ°μ²΄λ₯Ό ν΅ν΄ RSA λ°©μμμ μ μΈνκ³ privateKeyλ‘ μ΅μ’ λ³ννλ€.
- [2]μμλ RSA μνΈν λ°©μμ μ΄κΈ°ννλλ° Cipher.getInstance()μ νλΌλ―Έν°λ₯Ό ν΅ν΄ 컀μ€ν
ν λ°©μμ μ€μ ν μ μλ€.
- κΈ°λ³Έμ μΌλ‘ "RSA"λ§ μ
λ ₯νλ©΄ μμ μ½λμ κ°μ΄ "RSA/ECB/PKCS1Padding"λ‘ μ€μ λλ€.
- μλμ μ€λͺ νκ² μ§λ§ μ μμλͺ μ κ²½μ° PKCS1Paddingμ μ¬μ©ν΄μΌ νλ€.
- μΌμͺ½λΆν° "μνΈν λ°©μ/λΈλ‘ μνΈ μ΄μ© λͺ¨λ/ν¨λ© μ€ν€λ§"λ₯Ό μ€μ ν μ μλ€.
- μνΈν λ°©μμ RSAμ΄λ€.
- λΈλ‘ μνΈ μ΄μ© λͺ¨λλ λμΉν€μμ μ¬μ©νλ μμ€ν
μ΄κΈ° λλ¬Έμ RSAμμλ νμλ‘ νμ§ μμ§λ§ κ΄λ‘μ μ λλ€. μ€μ λ‘ Cipher ν΄λμ€μ μλ¨ μ£Όμμλ "RSA/ECB/PKCS1Padding"λΌκ³ μ νμλ€.
- AESμ κ°μ λμΉν€λ₯Ό μ¬μ©νλ κ²½μ° ECB (Electronic Codebook) λͺ¨λ μΈμλ CBC (Cipher Block Chaining), CTR (Counter), CFB (Cipher Feedback), OFB (Output Feedback) λ° GCM (Galois/Counter Mode)κ³Ό κ°μ λ€μν λͺ¨λλ₯Ό μ¬μ©ν μ μλ€.
- ν¨λ© μ€ν€λ§μ κ²½μ° PKCS1Paddingμ RSA μνΈνμμ μ¬μ©λλ ν¨λ© μ€ν€λ§μ μ€λλ νμ€μ΄λ©°, λ°μ΄ν°μ μμ μ±μ 보μ₯νκΈ° μν΄ μΆκ°λλ€.
- μ¬κΈ°μ ν¨λ©μ΄λ μλ³Έ λ°μ΄ν°μ λμμ κ°μ λ³λμ μΆκ°μ μΈ λ°μ΄ν°λ₯Ό λν΄ μλ³Έ λ°μ΄ν°λ₯Ό μνΈννλ λ°μ κ·μΉμ±μ μ νμμΌ μμ μ±μ κ°ννλ μν μ νλ€.
- PKCS1Paddingμ RSA μνΈνμμ λΈλ‘ ν¬κΈ°μ λ§μΆ° λ°μ΄ν°λ₯Ό ν¨λ© νλ λ°©μμ΄λ€. μ΄ ν¨λ©μ 곡κ°ν€ μνΈν μ λ°μν μ μλ μΌλΆ μ·¨μ½μ μ 보μνκ³ λ°μ΄ν°μ 무결μ±κ³Ό 보μμ±μ κ°ννλ€. κ·Έλ¬λ PKCS1Paddingμλ μΌλΆ μ νμ¬νκ³Ό μ·¨μ½μ μ΄ μμ μ μλ€. μλ₯Ό λ€μ΄, ν¨λ© μ€λΌν΄(oracle) 곡격과 κ°μ 곡격 벑ν°κ° μ‘΄μ¬ν μ μμΌλ©°, μ΄λ₯Ό λ°©μ§νκΈ° μν΄ μΆκ°μ μΈ μ‘°μΉκ° νμν μλ μλ€.
- μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ λ κ°λ ₯ν 보μμ μ 곡νλ OAEP (Optimal Asymmetric Encryption Padding) ν¨λ© μ€ν€λ§κ° κ°λ°λμλ€. OAEPλ PKCS1Paddingλ³΄λ€ μμ νλ©°, SHA-1 λλ SHA-256κ³Ό MGF1(Mask Generation Function 1)μ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό ν¨λ© νλ€. λ°λΌμ OAEP ν¨λ© (RSA/ECB/OAEPWithSHA-1AndMGF1Padding λλ RSA/ECB/OAEPWithSHA-256AndMGF1Padding)μ μ¬μ©νλ κ²μ΄ μ’λ€.
- μλλ Cipher ν΄λμ€μ μ£Όμ μ€ μΌλΆμ΄λ€.
- κΈ°λ³Έμ μΌλ‘ "RSA"λ§ μ
λ ₯νλ©΄ μμ μ½λμ κ°μ΄ "RSA/ECB/PKCS1Padding"λ‘ μ€μ λλ€.
- [3]μμλ μνΈνν λ°μ΄ν°λ₯Ό λ°μ΄νΈλ°°μ΄λ‘ λ³ννλλ° μ΄λ UTF-8 μΈμ½λ© λ°©μμμ λͺ μνλ€.
- μ΄ν μ΅μ’
μ μΌλ‘ Base64 μΈμ½λ©μ ν΅ν΄ String νμ
μΌλ‘ λ³ννκ³ λ¦¬ν΄νλ€.
- μ΄ λΆλΆ μμ Hex(16μ§μ)λ‘ λ³ννμ¬ λ¦¬ν΄νλ λ°©λ²λ μλ€.
ποΈ Cipher ν΄λμ€ μλ¨μ μ£Όμ
* the following standard {@code Cipher} transformations with the keysizes
* in parentheses:
* <ul>
* <li>{@code AES/CBC/NoPadding} (128)</li>
* <li>{@code AES/CBC/PKCS5Padding} (128)</li>
* <li>{@code AES/ECB/NoPadding} (128)</li>
* <li>{@code AES/ECB/PKCS5Padding} (128)</li>
* <li>{@code AES/GCM/NoPadding} (128)</li>
* <li>{@code DESede/CBC/NoPadding} (168)</li>
* <li>{@code DESede/CBC/PKCS5Padding} (168)</li>
* <li>{@code DESede/ECB/NoPadding} (168)</li>
* <li>{@code DESede/ECB/PKCS5Padding} (168)</li>
* <li>{@code RSA/ECB/PKCS1Padding} (1024, 2048)</li>
* <li>{@code RSA/ECB/OAEPWithSHA-1AndMGF1Padding} (1024, 2048)</li>
* <li>{@code RSA/ECB/OAEPWithSHA-256AndMGF1Padding} (1024, 2048)</li>
- AES, RSAλ₯Ό μ¬μ©ν λμ κΈ°λ³Έμ μΌλ‘ μ§μνλ λΈλ‘μνΈ μ΄μ© λͺ¨λ(AESλ§ ν΄λΉ)μ ν¨λ© μ€ν€λ§κ° λͺ μλμ΄ μλ€.
- μ΄λ₯Ό μμ©νλ©΄ AESλ μ½κ² ꡬνν μ μμ κ²μΌλ‘ 보μΈλ€.
π§Ή RSA ν¨λ© μ€ν€λ§ μ 리
RSA/ECB/PKCS1Padding
- μ΄ ν¨λ©μ μ€λλ νμ€μ΄μ§λ§ μ¬μ ν λ리 μ¬μ©λλ€.
- μ£Όλ‘ λ°μ΄ν°μ λΈλ‘ λ¨μκ° μλ μ§§μ λ©μμ§λ₯Ό μνΈννλ κ²½μ°μ μ ν©νλ€.
- μλ₯Ό λ€μ΄, μ μ μλͺ λ° μΈμ¦μμ μ¬μ©λ μ μλ€.
RSA/ECB/OAEPWithSHA-1AndMGF1Padding
- PKCS#1 v1.5λ³΄λ€ λ μ΅μ μ΄κ³ μμ ν μ΅μ μ΄λ€.
- SHA-1 ν΄μ ν¨μμ MGF1μ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό ν¨λ© μ²λ¦¬λ₯Ό νλ€.
- κΈ°λ°μ±κ³Ό μμ μ±μ΄ μ€μν μν©μμ μ¬μ©ν μ μλ€.
RSA/ECB/OAEPWithSHA-256AndMGF1Padding
- λ³΄λ€ κ°λ ₯ν 보μμ΄ νμν κ²½μ°μ μ νλλ μ΅μ μ΄λ€.
- SHA-256 ν΄μ ν¨μμ MGF1μ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό ν¨λ© μ²λ¦¬λ₯Ό νλ€.
- 보μ μꡬμ¬νμ΄ μ격νκ±°λ κ³ λμ 보μ κ°νκ° νμν μν©μμ μ¬μ©ν μ μλ€.
π¨ μ£Όμ
- μμ κ°μ΄ κ°μΈν€λ‘ μλͺ (μνΈν)νλ μ μμλͺ λ°©μμ κ²½μ°μ RSA/ECB/OAEPWithSHA-1AndMGF1Padding λλ RSA/ECB/OAEPWithSHA-256AndMGF1Padding)μ μ¬μ©νκ² λλ©΄ Caused by: java.security.InvalidKeyException: OAEP cannot be used to sign or verify signaturesμ κ°μ μλ¬λ₯Ό λ§λκ² λλ€.
- λ°λΌμ μ μμλͺ μ κ²½μ° μμ²λΌ "RSA/ECB/PKCS1PADDING"λ₯Ό μ¬μ©νλ©΄ λλ€.
- λ°λλ‘ RSAλ‘ λ°μ΄ν°λ₯Ό μνΈννλ κ²½μ°μλ OAEP ν¨λ© μ€ν€λ§λ₯Ό μ¬μ©νλ κ²μ΄ λ³΄λ€ μμ ν λ°μ΄ν° μνΈνκ° κ°λ₯νλ€.
- λ°μ΄ν° μνΈνμμλ PKCS1Paddingλ₯Ό κΆμ₯νμ§ μλλ€.
- μ΄μ λ μ λͺ¨λ₯΄κ² μΌλ, μ μμλͺ μ κ²½μ° λ°μ΄ν°μ μμ ν μνΈν λͺ©μ 보λ€λ μΈμ¦, μ¦λͺ μ λν λͺ©μ μ΄ ν¬κΈ° λλ¬Έμ κ°λ ₯ν μνΈνκ° λΆνμνκΈ° λλ¬Έμ΄ μλκΉ μΆλ€.
π 볡νΈν ν΄λμ€
public class RsaVerifier {
// String κ°μ²΄λ‘ λ³ν ν 리ν΄
public static String decryptReturnNewString(String encryptedValue, String publicKeyStr) {
try {
// [1] Base64λ‘ μΈμ½λ©λ κ³΅κ° ν€λ₯Ό PublicKey κ°μ²΄λ‘ λ³νν©λλ€.
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
// [2] RSA 볡νΈν λ°©μμ μ€μ νλ€.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
// [3]
byte[] encryptedValueBytes = Base64.getDecoder().decode(encryptedValue);
byte[] decryptedValueBytes = cipher.doFinal(encryptedValueBytes);
return new String(decryptedValueBytes);
} catch (Exception e) {
throw new RuntimeException(e); // νμμ λ°λΌ μμΈ μ²λ¦¬λ₯Ό ν©λλ€
}
}
}
- μμ λ©μλλ κ°μΈν€λ‘ μνΈνλ λ°μ΄ν°λ₯Ό 곡κ°ν€λ‘ 볡νΈννλ€.
- [1]μμλ Base64λ‘ μΈμ½λ© λ 곡κ°ν€λ₯Ό PublicKey κ°μ²΄λ‘ λ³ννλ€.
- μμ ν€ μμ± λ‘μ§μμ Base64λ‘ μΈμ½λ©νμ¬ String νμ
μΌλ‘ λ³ννκΈ° λλ¬Έμ μμΌλ‘ Base64λ‘ λμ½λ©νμ¬ PublicKey νμ
μΌλ‘ λ³νν΄ μ£Όλ κ²μ΄λ€.
- μ¬κΈ°μλ λ§μ°¬κ°μ§μ΄λ€. λ§μ½ Hexλ‘ μΈμ½λ©ν String νμ μ ν€λ₯Ό κ°μ§κ³ μλ€λ©΄ Hexλ‘ λμ½λ©νμ¬μΌ νλ€.
- String νμ μ 곡κ°ν€λ₯Ό PublicKey νμ μΌλ‘ λ³ννλ κ²½μ° X509EncodedKeySpec κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ νλ€.
- KeyFactory κ°μ²΄λ₯Ό ν΅ν΄ RSA λ°©μμμ μ μΈνκ³ publicKey ν€λ‘ μ΅μ’ λ³ννλ€.
- [2]μμλ μνΈν λ°©μκ³Ό λκ°μ΄ 볡νΈν λ°©μμ μ€μ νλ€.
- μνΈν λ°©μμμ μ€μ ν μΈν κ°μ κ·Έλλ‘ μ¬μ©νκ³
- DECRYPT_MODEμμ λͺ μνκ³ , 곡κ°ν€λ‘ μ΄κΈ°ννλ€.
- [3]μμλ 볡νΈν λ°μ΄ν°λ₯Ό Base64λ‘ λμ½λ©νμ¬ λ°μ΄νΈλ°°μ΄λ‘ λ³ννκ³
- 볡νΈνλ₯Ό μ§ννμ¬ μλ³Έ λ°μ΄ν°μ λ°μ΄νΈ λ°°μ΄κ°μ μ»λλ€.
- μ΄ν μ΅μ’
μ μΌλ‘ new String κ°μ²΄λ₯Ό μμ±νμ¬ String νμ
μΌλ‘ λ³ννκ³ λ¦¬ν΄νλ€.
- new Stringμ λ°μ΄νΈ λ°°μ΄μ λ¬Έμμ΄λ‘ λ³ννλ κ²μ΄κ³ , toString()μ λ°μ΄νΈ λ°°μ΄ μ체μ λ¬Έμμ΄μ κ°μ μλ―Ένλ―λ‘ λ°μ΄νΈ λ°°μ΄μ΄ μλ―Ένλ λ¬Έμλ₯Ό μ»κΈ° μν΄μ new String κ°μ²΄λ₯Ό μ¬μ©ν΄μΌ νλ€.
- μ΄λ μ£Όμν΄μΌ ν μ μ΄ λ§μ½ Base64.getEncoder().encodeToString()μ μ¬μ©νμ¬ λ¦¬ν΄νλ©΄ Base64λ‘ μΈμ½λ©ν κ°μ String νμ μΌλ‘ λ³νν κ°μ΄ 리ν΄λκΈ° λλ¬Έμ μλ³Έ λ°μ΄ν°μ κ°κ³Ό μ ν λ€λ₯Έ κ°μ΄ λμ¬ μ μλ€.
π ν μ€νΈ λ©μλ λ° κ²°κ³Ό
public static void rsaEncryptDecryptTest() {
String text = "μλ
νμΈμ.";
String publicKeyByJava = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlK5ioVvjb1CHE+wl0Od9tekm7tMLB06ApYKuwEVEFQNRRdcVToNnHMf80Hy17LHAv4R83UTf6ZOy3IeLWbjFMp43s3K4SCS1e94T9bojztWLuwrSDIrGMXfKOsnaEdJyAEAqocL+HSZTOGpM20UGKIHzKK+VDwFYsP1d2qoRBhy6bLE/hbFYodc5iIFeB+U8vpHwcSROYXdZ+hceo9oBxMZM0Kv+SqOFIcguVEoIteMH7VjSXR1vtfN5yCDRrLKwj6FOPTO9EXHsgbc1+PwOntSLGxm7AbgS90BvEmHDSXlUt7hA2WHeP7PCsN1cYYpuca+nRAP3jwfVMLSxsziq8wIDAQAB";
String privateKeyByJava = "미리 μμ±ν privateKey";
// κ°μΈν€λ‘ μνΈν
String encrypted = RsaGenerator.encrypt(text, privateKeyByJava);
// 곡κ°ν€λ‘ 볡νΈν
String decryptReturnBase64 = RsaVerifier.decryptReturnBase64(encrypted, publicKeyByJava);
String decryptNewString = RsaVerifier.decryptReturnNewString(encrypted, publicKeyByJava);
System.out.println("### decryptReturnBase64 : " + decryptReturnBase64); // Base64 return
// ### decryptReturnBase64 : 7JWI64WV7ZWY7IS47JqULg==
System.out.println("### decryptNewString : " + decryptNewString); // string return
// ### decryptNewString : μλ
νμΈμ.
}
- μμ κ²°κ³Όμ²λΌ λ§μ½ Base64λ‘ μΈμ½λ©ν νμ 리ν΄νλ©΄ μλ³Έ λ°μ΄ν°μ "μλ
νμΈμ"κ° μλ Base64λ‘ μΈμ½λ© κ°μ String λ³ν κ°μ΄ λμ€λ μ£Όμν΄μΌ νλ€.
- 볡νΈν λ©μλλ μλ³Έκ°μ μ»μ΄μΌ νλ―λ‘ Hexλ Base64λ‘ μΈμ½λ©νμ¬ λ¦¬ν΄νμ§ λ§κ³ new String κ°μ²΄λ‘ 리ν΄ν΄μΌ νλ€.
- 곡κ°ν€λ‘ μνΈννκ³ κ°μΈν€λ‘ 볡νΈννλ λ°©μμ μμ λ°©μμ λ³΄κ³ μμ©νλ©΄ μ½κ² λ§λ€ μ μμ κ² κ°λ€.
π SHA-256μ νμ©ν μ μμλͺ ꡬν
- μ μμλͺ μ νμΈμκ² λλ₯Ό νΉμ λ΄κ° λ§λ κ²μμ μ μ¦νλ μ©λλ‘ μ¬μ©νλ€.
- μμ κ°μΈν€λ‘ μνΈν 곡κ°ν€λ‘ 볡νΈννλ λ°©μμμ SHA-256 ν΄μν¨μλ₯Ό νμ©νμ¬ μ μμλͺ μ ꡬνν μ μλ€.
- μ¬κΈ°μμλ λνμ μΈ μΈμ½λ© λ°©μμΈ 16μ§μ λ³νκ³Ό Base64 μΈμ½λ© λ³ν λ κ°μ§ λͺ¨λ 보μ¬μ£Όκ² λ€.
- SHA-256κ³Ό μλ°μμμ ꡬνμ λν μμΈν λ΄μ©μ μ΄ κΈμ μ°Έκ³ νλλ‘ νμ.
π‘ SHA-256μ νμ©ν μ μμλͺ μ μμ
- μ² μλ RSA λ°©μμ 곡κ°ν€μ κ°μΈν€λ₯Ό λ§λ€μλ€.
- μ² μλ μν¬μκ² μ€ λ°μ΄ν°λ₯Ό SHA-256μΌλ‘ ν΄μνκ³ , κ·Έ ν΄μκ°μ μμ μ κ°μΈν€λ‘ μλͺ (μνΈν)νλ€.
- μ² μλ μν¬μκ² <μμ μ 곡κ°ν€>μ, <μμ μ κ°μΈν€λ‘ μνΈνλ ν΄μ λ°μ΄ν°>, <μλ³Έ λ°μ΄ν°>λ₯Ό μ£Όμλ€.
- μν¬λ <μ² μμ 곡κ°ν€>μ, <μ² μμ κ°μΈν€λ‘ μνΈν λ ν΄μ λ°μ΄ν°>, <μλ³Έ λ°μ΄ν°>λ₯Ό λ°μλ€.
- μν¬λ <μ² μμ 곡κ°ν€>λ‘ <μνΈνλ ν΄μ λ°μ΄ν°>λ₯Ό 볡νΈννμ¬ λμ¨ ν΄μκ°κ³Ό, μλ³Έ λ°μ΄ν°λ₯Ό μ§μ ν΄μνμ¬ λμ¨ ν΄μκ°μ λΉκ΅νμ¬ μ² μκ° ν΄λΉ λ°μ΄ν°λ₯Ό λ§λ€μμΌλ©°, μλ³Έ λ°μ΄ν°κ° λ³μ‘°λμ§ μμμμ μ λ’°ν μ μλ€.
π SHA256 ν΄λμ€(Return Hex)
public class Sha256ToHex {
/**
* μ
λ ₯ λ°μ λ¬Έμμ΄μ SHA-256μΌλ‘ ν΄μ±νμ¬ ν΄μ κ°μ λ°νν¨
* @param text
* @return ν΄μκ°
* @throws NoSuchAlgorithmException
*/
public String encrypt(String text) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(text.getBytes());
return bytesToHex(md.digest());
}
/**
* λ°μ΄νΈ λ°°μ΄μ 16μ§μ λ¬Έμμ΄λ‘ λ°νν¨
* @param bytes
* @return 16μ§μ λ¬Έμμ΄
*/
private String bytesToHex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}
}
- 리ν΄μ 16μ§μλ‘ νλ€.
π SHA256 ν΄λμ€(Return Base64)
public class Sha256ToBase64 {
/**
* μ
λ ₯ λ°μ λ¬Έμμ΄μ SHA-256μΌλ‘ ν΄μ±νμ¬ ν΄μ κ°μ λ°νν¨
* @param text
* @return ν΄μκ°
* @throws NoSuchAlgorithmException
*/
public String encrypt(String text) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(text.getBytes());
return Base64.getEncoder().encodeToString(md.digest());
}
}
- 리ν΄μ Base64λ‘ μΈμ½λ© λ¬Έμμ΄λ‘ νλ€.
π RsaGenerator(μ μμλͺ μμ±) ν΄λμ€
public class RsaGenerator {
public static String encryptWithHexHash(String data, String privateKeyStr) {
try {
// Base64λ‘ μΈμ½λ©λ κ°μΈ ν€λ₯Ό PrivateKey κ°μ²΄λ‘ λ³νν©λλ€.
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// λ°μ΄ν°λ‘λΆν° SHA-256 ν΄μ κ°μ μμ±νκ³ 16μ§μλ‘ λ³νν©λλ€.
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashedData = md.digest(data.getBytes(StandardCharsets.UTF_8));
String sha256hex = bytesToHex(hashedData);
// RSA κ°μΈ ν€λ₯Ό μ¬μ©νμ¬ ν΄μ κ°μ μνΈνν©λλ€.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedHashValue = cipher.doFinal(sha256hex.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedHashValue);
} catch (Exception e) {
throw new RuntimeException(e); // νμμ λ°λΌ μμΈ μ²λ¦¬λ₯Ό ν©λλ€
}
}
public static String encryptWithBase64(String data, String privateKeyStr) {
try {
// Base64λ‘ μΈμ½λ©λ κ°μΈ ν€λ₯Ό PrivateKey κ°μ²΄λ‘ λ³νν©λλ€.
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// λ°μ΄ν°λ‘λΆν° SHA-256 ν΄μ κ°μ μμ±νκ³ Base64λ‘ μΈμ½λ©ν©λλ€.
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashedData = md.digest(data.getBytes(StandardCharsets.UTF_8));
String sha256Base64 = Base64.getEncoder().encodeToString(hashedData);
// RSA κ°μΈ ν€λ₯Ό μ¬μ©νμ¬ ν΄μ κ°μ μνΈνν©λλ€.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedHashValue = cipher.doFinal(sha256Base64.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedHashValue);
} catch (Exception e) {
throw new RuntimeException(e); // νμμ λ°λΌ μμΈ μ²λ¦¬λ₯Ό ν©λλ€
}
}
public static String encryptNoHash(String data, String privateKeyStr) {
try {
// Base64λ‘ μΈμ½λ©λ κ°μΈ ν€λ₯Ό PrivateKey κ°μ²΄λ‘ λ³νν©λλ€.
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
// RSA κ°μΈ ν€λ₯Ό μ¬μ©νμ¬ ν΄μ κ°μ μνΈνν©λλ€.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(encryptedData);
} catch (Exception e) {
throw new RuntimeException(e); // νμμ λ°λΌ μμΈ μ²λ¦¬λ₯Ό ν©λλ€
}
}
private static String bytesToHex(byte[] hash) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
}
- μΈ κ°μ λ©μλ μ€ λ§μ§λ§ encryptNoHashλ ν΄μλ₯Ό μ¬μ©νμ§ μμ λ©μλμ΄λ€.
- λλ¨Έμ§ λ κ°μ λ©μλμ μ°¨μ΄μ μ λ°μ΄νΈ λ°°μ΄μ ν΄μκ°μ 16μ§μλ‘ λ³ννκ³ μνΈννλ, Bas64λ‘ λ³ννκ³ μνΈννλμ΄λ€.
π RsaVerifier ν΄λμ€(μ μμλͺ 볡νΈν) ν΄λμ€
public class RsaVerifier {
public static String decryptReturnNewString(String encryptedValue, String publicKeyStr) {
try {
// Base64λ‘ μΈμ½λ©λ κ³΅κ° ν€λ₯Ό PublicKey κ°μ²΄λ‘ λ³νν©λλ€.
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
// μνΈνλ ν΄μ κ°μ 볡νΈνν©λλ€.
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1PADDING");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] encryptedValueBytes = Base64.getDecoder().decode(encryptedValue);
byte[] decryptedValueBytes = cipher.doFinal(encryptedValueBytes);
return new String(decryptedValueBytes);
} catch (Exception e) {
throw new RuntimeException(e); // νμμ λ°λΌ μμΈ μ²λ¦¬λ₯Ό ν©λλ€
}
}
}
- μμ 볡νΈν λ©μλ κ·Έλλ‘μ΄λ€.
- λ€μ ν λ² κ°μ‘°νμ§λ§ 볡νΈν λ©μλμ 리ν΄μ μΈμ½λ©μ λ£μΌλ©΄ λ¦¬ν΄ κ°μ΄ μλ³Έκ°κ³Ό λ€λ₯΄κ² λμ¨λ€. μ£Όμνμ.
π ν μ€νΈ λ©μλ λ° κ²°κ³Ό
public static void rsaTest(String text) throws NoSuchAlgorithmException {
Sha256ToBase64 sha256ToBase64 = new Sha256ToBase64();
Sha256ToHex sha256ToHex = new Sha256ToHex();
// textλ₯Ό SHA-256μΌλ‘ ν΄μνμ¬ λκ°μ§ λ°©μ(Base64, Hex)μΌλ‘ 리ν΄
System.out.println("SHA-256 ENCRYPT");
System.out.println("### μλ³Έ text : " + text);
System.out.println("### sha256ToHex : " + sha256ToHex.encrypt(text));
System.out.println("### sha256ToBase64 : " + sha256ToBase64.encrypt(text));
// μλ°μμ λ§λ 곡κ°ν€μ κ°μΈν€
String publicKeyByJava = "미리 μμ±ν 곡κ°ν€";
String privateKeyByJava = "미리 μμ±ν κ°μΈν€":
String encryptNoHash = RsaGenerator.encryptNoHash(text, privateKeyByJava);
String encryptedTextWithHex = RsaGenerator.encryptWithHexHash(text, privateKeyByJava);
String encryptedTextWithBase64 = RsaGenerator.encryptWithBase64(text, privateKeyByJava);
String decryptedNoHash = RsaVerifier.decryptReturnNewString(encryptNoHash, publicKeyByJava);
String decryptedTextWithHex = RsaVerifier.decryptReturnNewString(encryptedTextWithHex, publicKeyByJava);
String decryptedTextWithBase64 = RsaVerifier.decryptReturnNewString(encryptedTextWithBase64, publicKeyByJava);
System.out.println("RSA DECRYPT");
System.out.println("### decryptedNoHash : " + decryptedNoHash);
System.out.println("### decryptedTextWithHex : " + decryptedTextWithHex);
System.out.println("### decryptedTextWithBase64 : " + decryptedTextWithBase64);
}
/**
SHA-256 ENCRYPT
### (1) μλ³Έ text : μλ
νμΈμ.
### (2) sha256ToHex : 8b118d6741f7cfa1a7ee246d0dda39f2f00bf9fd207b4e6c7fad87a15434a513
### (3) sha256ToBase64 : ixGNZ0H3z6Gn7iRtDdo58vAL+f0ge05sf62HoVQ0pRM=
RSA DECRYPT
### (1) decryptedNoHash : μλ
νμΈμ.
### (2) decryptedTextWithHex : 8b118d6741f7cfa1a7ee246d0dda39f2f00bf9fd207b4e6c7fad87a15434a513
### (3) decryptedTextWithBase64 : ixGNZ0H3z6Gn7iRtDdo58vAL+f0ge05sf62HoVQ0pRM=
*/
- κ²°κ³Όλ₯Ό μ°¨λ‘λλ‘ μ΄ν΄λ³΄μ.
- ν΄μλ₯Ό νμ§ μμ μνμμ κ°μΈν€λ‘ μνΈννκ³ κ³΅κ°ν€λ‘ 볡νΈννλ©΄ μλ³Έ κ·Έλλ‘μ κ°μ΄ λμ¨λ€.
- λ°μ΄ν°λ₯Ό Sha256μΌλ‘ ν΄μνμ¬ λμ¨ λ°μ΄νΈ λ°°μ΄μ 16μ§μλ‘ λ³ννκ³ λ°μ΄νΈ λ°°μ΄λ‘ λ°κΏ μνΈνν κ²½μ°(ν΄μκ°μ Sha256ToHex), μ΄λ₯Ό 볡νΈνν λ 리ν΄μΌλ‘ λμ¨ ν΄μκ°(λ°μ΄νΈ λ°°μ΄)μ new String κ°μ²΄λ‘ λ³ννλ©΄ 16μ§μλ‘ μΈμ½λ©λ String ν΄μκ°μ μ»μ μ μλ€.
- λ°μ΄ν°λ₯Ό Sha256μΌλ‘ ν΄μνμ¬ λμ¨ λ°μ΄νΈ λ°°μ΄μ Base64λ‘ λ³ννκ³ λ°μ΄νΈ λ°°μ΄λ‘ λ°κΏ μνΈνν κ²½μ°(ν΄μκ°μ Sha256ToBase64), μ΄λ₯Ό 볡νΈνν λ 리ν΄μΌλ‘ λμ¨ ν΄μκ°(λ°μ΄νΈ λ°°μ΄)μ new String κ°μ²΄λ‘ λ³ννλ©΄ Base64λ‘ μΈμ½λ©λ String ν΄μκ°μ μ»μ μ μλ€.
π μ 리
μ€λͺ μ΄ λ§€μ° μ΄λ ΅κΈ° λλ¬Έμ κ°λ¨ν μ 리νλ©΄ SHA-256μ΄λ , RSA μνΈνλ κ²°κ΅ λ°μ΄νΈ λ°°μ΄λ‘ encryptλκΈ° λλ¬Έμ μνΈν λ©μλμμλ κ°λ°μκ° μ½κ³ λ°μ΄ν°λ² μ΄μ€μ μνν μ μ₯νκΈ° μν΄ λ¦¬ν΄ν λ λ°λμ String νμ μΌλ‘ λ³νν΄μ€μΌ νλ€. μ΄λ Hexλ‘ λ³νν κ²μΈμ§, Base64λ‘ λ³νν κ²μΈμ§λ₯Ό μ ννμ¬ ν κ°μ§ λ°©λ²μΌλ‘ ν΅μΌν΄μΌλ§μ΄ 볡νΈννμ λ μ¬λ°λ₯Έ ν΄μκ°μ μ»μ μ μλ€.
볡νΈν(decrypt) λ©μλμ κ²½μ° μλ³ΈμΈ λ¬Έμμ΄ νμ μ κ·Έλλ‘ λ¦¬ν΄ν΄μΌ νλλ° λ¦¬ν΄ κ°μ Hexλ Base64λ‘ μΈμ½λ©νκ² λλ©΄ λΆνμν μΈμ½λ© κ³Όμ λλ¬Έμ μλ³Έ λ°μ΄ν°κ° μΈμ½λ© λμ΄ μ ν λ€λ₯Έ κ°μ΄ λμ¨λ€. λ°λΌμ 볡νΈν λ©μλμ κ²½μ°λ λ°λμ new String κ°μ²΄λ‘ 리ν΄νμ.
μΆκ°μ μΌλ‘ SHA-256 ν΄μκ° λ€μ΄κ° κ²½μ° λ³΅νΈν λ©μλλ new StringμΌλ‘ 리ν΄νκΈ° λλ¬Έμ μνΈν λ©μλ λ΄λΆμμ SHA-256μΌλ‘ ν΄μκ°μ ꡬν ν Hexλ Base64 λ±μΌλ‘ ν λ² μΈμ½λ©μ νκ³ κ·Έ μΈμ½λ© λ String κ°μ λ°μ΄νΈ λ°°μ΄λ‘ λ°κΏ μνΈν μ²λ¦¬λ₯Ό ν΄μΌ νλ€. μ΄λ κ² νμ§ μκ³ λ°μ΄νΈ λ°°μ΄μ SHA-256 ν΄μκ°μ κ·Έλλ‘ μνΈννκ² λλ©΄ 볡νΈν λ©μλμμ new StringμΌλ‘ 리ν΄ν κ²½μ° μλ±ν κ°μ΄ λμ€κ² λλ€. μΈμ½λ©νμ§ μμ ν΄μκ°μ λ°μ΄νΈ λ°°μ΄ κ·Έλλ‘ λ¬Έμμ΄ νμ μΌλ‘ λ°λμ΄ λ¦¬ν΄λκΈ° λλ¬Έμ΄λ€.
νΉμ¬λ μ΄ κΈμ λ³΄κ³ κ΅¬ννλ μ¬λμ΄ μλ€λ©΄ μΈμ λ μ§ λκΈμ λ¨κΈ°λ©΄ 보λ μ¦μ λ΅λ³νκ² λ€. λ.
μ°Έκ³
λ€ΌνΌ
'[JAVA]' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μλ°μμ AES μνΈν ꡬννκΈ° (3) | 2023.10.09 |
---|---|
μλ°μμ SHA-256 Hashing ꡬννκΈ° (2) | 2023.09.03 |
slf4j, log4j, log4j2, logback & logging level μμ½ μ 리 (2) | 2023.05.22 |
WEB-INFμ λν΄ μμ보기 (0) | 2023.05.15 |
Jar, War, Earμ λν μ 리 (0) | 2023.05.12 |