RSA cryptosystem ์ ์šฉ

GEONNYยท2024๋…„ 9์›” 9์ผ
0

Building-API

๋ชฉ๋ก ๋ณด๊ธฐ
25/28
post-thumbnail

๐Ÿ“ŒRSA

RSA๋Š” 1977๋…„ ์ด ์•”ํ˜ธ ์ฒด๊ณ„๋ฅผ ๊ฐœ๋ฐœํ•œ Ron Rivest, Adi Shamir, Leonard Adleman ์„ธ ์‚ฌ๋žŒ์˜ ์„ฑ์„ ๋”ฐ์„œ RSA ๋ผ๊ณ  ์ด๋ฆ„์ด ๋ถ™์—ฌ์กŒ์Šต๋‹ˆ๋‹ค. RSA๋Š” ๋น„๋Œ€์นญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๊ณต๊ฐœ ํ‚ค(Public Key)์™€ ๊ฐœ์ธ ํ‚ค(Private Key)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ SSL/TLS์— ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ฉฐ, ์ „์„ธ๊ณ„ ๋Œ€๋ถ€๋ถ„์˜ ์ธํ„ฐ๋„ท ๋ฑ…ํ‚น(๋Œ€ํ•œ๋ฏผ๊ตญ ํฌํ•จ)์ด ์ด RSA-2048 ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ฑ๋Šฅ๋ณด๋‹ค๋Š” ๋ณด์•ˆ์˜ ์ค‘์ ์„ ๋‘” ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ๋น„๋Œ€์นญ ์•”ํ˜ธํ™”

๋น„๋Œ€์นญ ์•”ํ˜ธํ™”๋Š” ์•”ํ˜ธํ™”์™€ ๋ณตํ˜ธํ™”์— ์„œ๋กœ ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
๊ณต๊ฐœ ํ‚ค (Public Key): ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ณต๊ฐœ ๊ฐ€๋Šฅํ•œ ํ‚ค์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๊ฐœ์ธ ํ‚ค (Private Key): ์†Œ์œ ์ž๊ฐ€ ๋น„๋ฐ€๋กœ ์œ ์ง€ํ•˜๋Š” ํ‚ค๋กœ, ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณตํ˜ธํ™”ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋น„๋Œ€์นญ ์•”ํ˜ธํ™”์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋Š”, ๊ณต๊ฐœ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ค์ง ํ•ด๋‹น ๊ณต๊ฐœ ํ‚ค์™€ ์ง์„ ์ด๋ฃจ๋Š” ๊ฐœ์ธ ํ‚ค๋กœ๋งŒ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“ŒRSA์˜ ๊ธฐ๋ณธ ๊ฐœ๋…

RSA ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•ต์‹ฌ์€ ์ˆ˜ํ•™์  ์—ฐ์‚ฐ์— ๊ธฐ๋ฐ˜์„ ๋‘” ์†Œ์ธ์ˆ˜๋ถ„ํ•ด ๋ฌธ์ œ์˜ ๋ณต์žก์„ฑ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋งค์šฐ ํฐ ์ˆ˜๋ฅผ ์†Œ์ธ์ˆ˜๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— RSA์˜ ๋ณด์•ˆ์„ฑ์ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
RSA ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ ์ˆ˜ํ•™์  ๊ฐœ๋…์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋‘ ๊ฐœ์˜ ํฐ ์†Œ์ˆ˜ p์™€ q์˜ ๊ณฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณต๊ฐœ ํ‚ค์™€ ๊ฐœ์ธ ํ‚ค๋ฅผ ์ƒ์„ฑ
ํฐ ์ˆ˜๋ฅผ ์†Œ์ธ์ˆ˜๋ถ„ํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•ด ์•”ํ˜ธํ™”์˜ ์•ˆ์ •์„ฑ์„ ํ™•๋ณด

๐Ÿ“ŒRSA์˜ ์žฅ๋‹จ์ 

๐Ÿ“์žฅ์ 

๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ฑ
์†Œ์ธ์ˆ˜๋ถ„ํ•ด ๋ฌธ์ œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ ์ ˆํ•œ ํ‚ค ๊ธธ์ด(2048๋น„ํŠธ ์ด์ƒ)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

๋น„๋Œ€์นญ ์•”ํ˜ธํ™”
๊ฐ™์€ ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋Œ€์นญ ์•”ํ˜ธํ™”๋ณด๋‹ค ๋” ์•ˆ์ „ํ•œ ํ†ต์‹  ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ“๋‹จ์ 

์†๋„ ๋ฌธ์ œ
RSA๋Š” ๋Œ€์นญ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋А๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™”์™€ ํ˜ผํ•ฉํ•˜์—ฌ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•”ํ˜ธํ™” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

ํ‚ค ๊ธธ์ด ์ฆ๊ฐ€
ํ‚ค ๊ธธ์ด๊ฐ€ ์ฆ๊ฐ€ํ• ์ˆ˜๋ก ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™” ์—ฐ์‚ฐ์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ์—ฐ์‚ฐ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค.

๐Ÿ“ŒExample

RSA ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ†ตํ•ด ์„ฑ์„ฑ๋œ Public key ์™€ Private key ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ €์žฅํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์‹คํ–‰ ์‹œ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ํ‚ค๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“application.yml

rsa:
  algorithm: RSA
  key-size: 2048
  public-key: ${rsa-public}
  private-key: ${rsa-private}

ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ํ‚ค ์‚ฌ์ด์ฆˆ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. public-key, private-key ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. shift 2๋ฒˆ์„ ์—ฐ์†์œผ๋กœ ๋ˆŒ๋Ÿฌ ์ฐฝ์ด ๋œจ๋ฉด edit configurations ๊ฒ€์ƒ‰ํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Environtment variables ๊ฐ€ ์žˆ๋‹ค๋ฉด ์„ ํƒํ•ด์„œ rsa-private, rsa-public ์„ ๋“ฑ๋กํ•˜๊ณ , ์—†๋‹ค๋ฉด modify options ๋ฅผ ์„ ํƒํ•ด์„œ Alt + E (Environment variables) ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฐ’์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“CryptoService Interface

๋‹ค์–‘ํ•œ ์–‘๋ฐฉํ–ฅ ์•”ํ˜ธํ™” ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ Interface๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

public interface CryptoService {

    void createKey() throws NoSuchAlgorithmException;

    Key getPublicKey();

    String decrypt(String encryptedText);

    String encrypt(String plainText);
}

๐Ÿ“RsaCryptoService

CryptoService ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” RsaCryptoService๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. RSA ํ‚ค ํŽ˜์–ด ์ƒ์„ฑ, private key, public key ์กฐํšŒ, ์•”/๋ณตํ˜ธํ™” ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
common.encryption.rsa.RsaCryptoService

๐ŸŽˆConstructor

@Configuration
@Slf4j
public class RsaCryptoService implements CryptoService {
    private final String algorithm;
    private final int keySize;
    private final String privateKey;
    private final String publicKey;

    public RsaProvider(@Value("${rsa.algorithm}") String algorithm,
                       @Value("${rsa.key-size}") int keySize,
                       @Value("${rsa.private}") String privateKey,
                       @Value("${rsa.public}") String publicKey)
                       throws NoSuchAlgorithmException {
        this.algorithm = algorithm;
        this.keySize = keySize;
        this.privateKey = privateKey;
        this.publicKey = publicKey;
        if (StringUtils.isEmpty(this.privateKey) || StringUtils.isEmpty(this.publicKey)) {
            log.error("RSA public or private key does not exist. create new key. โ–ผ");
            createKey();
        }
    }
    //๊ณ„์†..

application.yml ์— ์„ค์ •ํ•œ ๊ฐ’์„ ์ƒ์„ฑ์ž์—์„œ ๋ถˆ๋Ÿฌ์˜ต๋‹ˆ๋‹ค. privateKey ๋‚˜ publicKey๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ ์ƒˆ๋กœ ์ƒ์„ฑ์„ ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽˆcreateKey

@Override
private void createKey() throws NoSuchAlgorithmException {
    SecureRandom secureRandom = new SecureRandom();
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(this.algorithm);
    keyPairGenerator.initialize(this.keySize, secureRandom);
    KeyPair keyPair = keyPairGenerator.genKeyPair();
    log.info("===========================RSA KEY===========================");
    log.info("private : {}", Base64.getEncoder()
    	.encodeToString(keyPair.getPrivate().getEncoded()));
    log.info("public : {}", Base64.getEncoder()
    	.encodeToString(keyPair.getPublic().getEncoded()));
}

ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Base64๋กœ ์ธ์ฝ”๋”ฉ ํ•˜์—ฌ ๋กœ๊ทธ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ๋œ ํ‚ค ๊ฐ’์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. IntelliJ์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Link๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๐ŸŽˆDecode key

private, public ํ‚ค๋ฅผ Base64 ๋กœ decoding ํ•˜์—ฌ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ServiceException ์— ๋Œ€ํ•ด์„œ๋Š” Link ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

public PrivateKey getPrivateKey() {
    try {
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder()
        	.decode(this.privateKey));
        KeyFactory keyFactory = KeyFactory.getInstance(this.algorithm);
        return keyFactory.generatePrivate(spec);
    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        throw new ServiceException(ErrorCode.SERVICE_ERROR, e);
    }
}

@Override
public PublicKey getPublicKey() {
    try {
        X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.getDecoder()
        	.decode(this.publicKey));
        KeyFactory keyFactory = KeyFactory.getInstance(this.algorithm);
        return keyFactory.generatePublic(spec);
    } catch (NoSuchAlgorithmException | InvalidKeySpecException | 
    		 NullPointerException e) {
        throw new ServiceException(ErrorCode.SERVICE_ERROR, e);
    }
}

๐ŸŽˆencrypt, decrypt

public key ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”, private key ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณตํ˜ธํ™” ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

@Override
public String decrypt(String encrypted) {
    PrivateKey privateKey = getPrivateKey();
    try {
        byte[] byteEncrypted = Base64.getDecoder().decode(encrypted.getBytes());
        Cipher cipher = Cipher.getInstance(this.algorithm);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] bytePlain = cipher.doFinal(byteEncrypted);
        return new String(bytePlain, StandardCharsets.UTF_8);
    } catch (IllegalArgumentException | NoSuchAlgorithmException | 
    		 NoSuchPaddingException | InvalidKeyException | 
             IllegalBlockSizeException | BadPaddingException e) {
        log.error("RSA decrypt error. encrypted value : {}", encrypted);
        throw new ServiceException(ErrorCode.INVALID_PARAMETER, e);
    }
}

@Override
public String encrypt(String plainText) {
    PublicKey publicKey = getPublicKey();
    try {
        Cipher cipher = Cipher.getInstance(this.algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] bytePlain = cipher.doFinal(plainText.getBytes());
        return Base64.getEncoder().encodeToString(bytePlain);
    } catch (NoSuchAlgorithmException | NoSuchPaddingException | 
             IllegalBlockSizeException | BadPaddingException | 
             InvalidKeyException e) {
        throw new ServiceException(ErrorCode.SERVICE_ERROR, e);
    }
}

์ด์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด RSA private, pubilc key ๊ฐ€ ํ˜„์žฌ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜์†”์— ์ƒ์„ฑ๋œ key๊ฐ€ ์ถœ๋ ฅ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

console

RSA public or private key does not exist. create new key. โ–ผ
=================================RSA KEY=================================
private : MIIEvQIBADANBgkqh...
public : MIIBIjANBgkqhkiG9w... 

์ถœ๋ ฅ๋œ ํ‚ค๋ฅผ ๋ณต์‚ฌํ•ด์„œ ์œ„์—์„œ ๋“ฑ๋กํ–ˆ๋˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์— ๋“ฑ๋ก์„ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“CryptoController

RSA public key ๋ฅผ ์ „์†กํ•  CryptoController ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
domain.encryption.CryptoController

@RestController
@RequiredArgsConstructor
@Tag(name = "์•”ํ˜ธํ™” ๊ด€๋ จ ์ •๋ณด ์š”์ฒญ", 
     description = "๋ณด์•ˆ์ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™” ํ•˜๊ธฐ ์œ„ํ•œ ํ‚ค ์š”์ฒญ")
@RequestMapping("v1")
public class CryptoController {
    private final CryptoService rsaCryptoService;
    private final MessageConfig messageConfig;

    @Operation(summary = "RSA Public Key ์š”์ฒญ", description = """
            """, operationId = "API-999-01")
    @PostMapping(value = "/key/rsa", produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<ItemResponse<PublicKeyResponse>> getPublicKey() {
        PublicKey key = (PublicKey) this.rsaCryptoService.getPublicKey();
        String keyString = Base64.getEncoder().encodeToString(key.getEncoded());
        PublicKeyResponse publicKeyResponse = PublicKeyResponse.builder()
        	.publicKey(keyString).build();
        return ResponseEntity.ok()
                .body(ItemResponse.<PublicKeyResponse>builder()
                        .status(messageConfig.getCode(NormalCode.SEARCH_SUCCESS))
                        .message(messageConfig.getMessage(NormalCode.SEARCH_SUCCESS))
                        .item(publicKeyResponse)
                        .build());
    }
}

์œ„์—์„œ ์ƒ์„ฑํ–ˆ๋˜ public key ๋ฅผ Base64๋กœ ์ธ์ฝ”๋”ฉ ํ•˜์—ฌ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์ถ”๊ฐ€์ ์œผ๋กœ ํ‚ค๋ฅผ ์š”์ฒญํ•˜๋Š” URI๋Š” ์ธ์ฆ์ด ํ•„์š”์—†๊ธฐ ๋•Œ๋ฌธ์— Spring Security์˜ ์ธ์ฆ URI ๋ชฉ๋ก์—์„œ ์ œ์™ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด SecurityConfig์˜ ignoreUris ๋ชฉ๋ก์— ์ฃผ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค.

์ด์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ›์€ Public key ๋ฅผ Base64๋กœ ๋””์ฝ”๋”ฉ ํ•œ ํ›„ ๋‚˜์˜จ ํ‚ค๋กœ password๋ฅผ ์•”ํ˜ธํ™” ํ•˜์—ฌ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์ด์ „์— ์ž‘์„ฑํ–ˆ๋˜ LoginService๋ฅผ RSA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

domain.login.LoginService

@Service
@RequiredArgsConstructor
public class LoginService {

    private final MemberQueryMethodRepository memberQueryMethodRepository;
    private final AuthenticationManagerBuilder authenticationManagerBuilder;
    private final TokenProvider tokenProvider;
    private final PasswordEncoder passwordEncoder;
    private final CryptoService rsaCryptoService; //์ถ”๊ฐ€

    @Transactional
    public TokenResponse login(
    		HttpServletResponse httpServletResponse, LoginRequest parameter) {
        Member member = this.memberQueryMethodRepository.findById(parameter.memberId())
                .orElseThrow(() -> new ServiceException(ErrorCode.NOT_AUTHENTICATION));
        String decodedPassword = this.rsaCryptoService.decrypt(parameter.password()); //์ถ”๊ฐ€
        if (!this.passwordEncoder.matches(decodedPassword, member.getPassword())) {
            throw new ServiceException(ErrorCode.NOT_AUTHENTICATION);
        }
        UsernamePasswordAuthenticationToken authenticationToken
        	= new UsernamePasswordAuthenticationToken(parameter.memberId(), 
            										  decodedPassword);
//์ดํ•˜ ์ƒ๋žต..

์•”ํ˜ธํ™”๋œ password๋ฅผ ๋ณตํ˜ธํ™” ํ›„ ๋™์ž‘ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
this.rsaProvider.encrypt("๋“ฑ๋กํ•œ password"); ๋กœ ์•”ํ˜ธํ™”๋œ ๊ฐ’์„ ๋ณต์‚ฌํ•˜์—ฌ password๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ๋กœ๊ทธ์ธ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽˆ์•”ํ˜ธํ™”๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š์„ ๊ฒฝ์šฐ

๐ŸŽˆ์ •์ƒ๋™์ž‘ ํ•  ๊ฒฝ์šฐ

Token ๊ฐ’์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค. LoginService ์ฐธ๊ณ .

๐Ÿ“ŒConclusion

RSA ์•”ํ˜ธํ™”๋Š” ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ์„ฑ์„ ์ž๋ž‘ํ•˜๋ฉฐ, ์ „์ž ์ƒ๊ฑฐ๋ž˜ ๋ฐ ๋””์ง€ํ„ธ ์„œ๋ช… ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ‚ค ๊ด€๋ฆฌ์™€ ์—ฐ์‚ฐ ์†๋„ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜๊ณ , ์ด ๋•Œ๋ฌธ์— AES์™€ ํ˜ผํ•ฉํ•˜์—ฌ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์ด ์‚ฌ์šฉ๋˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์—๋Š” AES ์•”ํ˜ธํ™”์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ  ์ด๋ฒˆ์— ์•Œ์•„๋ณธ RSA์— AES๋ฐฉ์‹์„ ํ˜ผํ•ฉํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

profile
Back-end developer

0๊ฐœ์˜ ๋Œ“๊ธ€