본문 바로가기
Language/Java

[Java] NodeJS와 매핑되는 AES 암호화 (Feat. React)

by J4J 2021. 11. 2.
300x250
반응형

안녕하세요. J4J입니다.

 

이번 포스팅은 자바에서 노드와 매핑되는 aes암호화 방식에에 대해 적어보는 시간을 가져보려고 합니다.

 

 

 

AES 암호화

 

회사에서 업무를 보던 도중 react에서 aes암호화 처리가 된 데이터를 spring에 넘겨주고 spring에서 복호화를 하여 데이터를 확인해야 하는 상황이 생겼었습니다.

 

aes암호화를 하는 방법은 검색을 해봤을 때 정말 여러 가지 방법이 있는 것으로 확인되지만 react는 react에서만, spring은 spring에서만 서로 암복호화가 되었습니다.

 

문제를 해결하기 위해 여러가지 시도를 해봤고 그중 발견한 방법에 대해 글을 남겨놓으려고 합니다.

 

 

 

우선 aes 암호화 방식은 aes128, aes192, aes256 등의 방식들이 존재하는데 key의 길이가 길어질수록 보안성이 높아지게 됩니다.

 

그렇기 때문에 aes256을 사용하는 것이 올바른 방법이지만 안타깝게도 제가 이번에 찾은 방법은 aes128을 사용해야 됩니다.

 

나중에 aes256을 이용하여 깔끔한 방식을 찾게 되면 다시 한번 관련 글을 작성해보겠습니다.

  ※ (수정) - aes256을 이용한 암호화 방법은 여기를 참고해주세요.

 

 

반응형

 

 

[ React ]

 

우선 react코드 입니다.

 

코드를 작성하기에 앞서 crypto 패키지를 설치해줘야 되기 때문에 다음 명령어를 이용하여 설치를 해주시면 됩니다.

 

$ npm install crypto

 

 

 

그리고 App.jsx파일에 다음과 같이 작성을 해보겠습니다.

 

import * as React from 'react';
import crypto from 'crypto';

const App = () => {

    const secretKey = "1234" + "5678" + "9012" + "3456"; // 암호화 키

    const encrypt = (text) => {
        const cipher = crypto.createCipheriv('aes-128-ecb', secretKey, '');
        let result = cipher.update(text, 'utf8', 'base64');
        result += cipher.final('base64');

        return result;
    }

    return (
        <div>
            <p>{encrypt('react-spring')}</p>
        </div>
    )
}

export default App;

 

 

 

코드를 작성하고 화면을 실행하면 react-spring이라는 평문을 암호화한 문자열을 확인할 수 있습니다.

 

실행 결과

 

 

 

[ Java]

 

이번엔 java코드입니다.

 

저 같은 경우는 AES라는 클래스 파일을 하나 만들어서 다음과 같이 작성해줬습니다.

 

package encryption;

import java.util.Base64;
import java.util.Base64.Decoder;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class AES {
	static byte secretKey[] = ("1234" + "5678" + "9012" + "3456").getBytes(); // 암호화 키
	static SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "AES");
	
	public static void main(String[] args) {
		String encryptedText = "V49rbRI23rcDsna9XjFz8w=="; // react에서 암호화한 문자열
		String decryptedText = new AES().Decrypt(encryptedText);
		
		System.out.println("decryptedText= " + decryptedText);
	}
	
	public String Decrypt(String encryptedText) {
		try {
			Cipher cipher = Cipher.getInstance("AES");
			cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
			
			Decoder docoder = Base64.getDecoder();
			byte decrypted[] = docoder.decode(encryptedText.getBytes("UTF-8"));

			return new String(cipher.doFinal(decrypted));
		} catch(Exception e) {
			e.printStackTrace();
		}
		
		return encryptedText;
	}
}

 

 

728x90

 

 

코드를 작성하고 실행해보면 다음과 같이 복호화된 문자열을 확인할 수 있습니다.

 

실행 결과

 

 

 

 

 

 

이상으로 자바에서 노드와 매핑되는 aes암호화 방식에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글