본문 바로가기

Javascript/Others

ChatGPT로 CryptoJS 알아보기

반응형

ChatGPT로 CryptoJS 알아보기

이번 포스트에서는 ChatGPT로 JavaScript 라이브러리인 CryptoJS에 대해서 간단하게 알아보고자 한다.
예전에 개인 사이드 프로젝트를 진행하다가 암호화를 해야 하는 작업을 했던 적이 있었는데,
어떻게 해야 할지 잘 몰라서 이리저리 검색하다가 CryptoJS를 사용해서 작업을 끝낸 적이 있었다.
그때는 사실 알아볼 시간도 딱히 없었는데 이번 기회에 ChatGPT로 한번 간단하게나마 공부해 보고자 한다.


CryptoJS란?
CryptoJS웹 기반 애플리케이션에서 보안을 제공하기 위한 자바스크립트 라이브러리이다.
이 라이브러리는 다양한 암호화 알고리즘을 제공하며, 이를 통해 개발자는 데이터를 암호화하거나 해시함수를 사용해 데이터를 보호할 수 있다.
CryptoJS는 MD5, SHA-1, SHA-256 등의 해시 알고리즘뿐만 아니라 AES, DES, Rabbit, MarC4 등의 대칭 암호화 알고리즘을 지원한다.

CryptoJS를 사용하면 클라이언트 측에서 쉽게 암호화를 수행할 수 있으므로 데이터를 보호하거나 인증 과정을 거칠 때 유용하게 사용된다.
이는 특히 서버와 클라이언트 사이에 민감한 정보를 전송해야 하는 웹 애플리케이션에서 중요하다.


예시
CryptoJS에서 지원하는 암호화 알고리즘들 중에서 몇가지만 예시로 확인해보자.
✔ AES
AES(Advanced Encryption Standard)는 미국 정부가 공식적으로 채택한 대칭키 암호화 알고리즘이다.
AES는 128비트 블록 크기를 가지며, 128비트, 192비트, 256비트의 키 길이를 지원한다.

AES는 원본 데이터(평문)와 비밀 키를 입력받아 암호화된 데이터(암호문)를 생성한다.
동일한 키를 사용하여 암호문을 복호화할 수 있다.
AES는안전성과 효율성 때문에 널리 사용되고 있다.

아래 코드는 AES 암호화 알고리즘을 사용하여 암호화하고, 이어서 복호화하여 원래의 메시지를 복원하는 예시이다.
위 코드의 Result를 확인하면 cipherText에는 message가 암호화(Encrypt)되어서 출력되는 것을 확인할 수 있다.
그리고 cipherText를 복호화(Decrpt)하여 originalText에는 원래의 텍스트인 "message"가 출력되는 것을 확인할 수 있다.
✔ MD5
MD5(Message-Digest Algorithm 5)데이터 무결성을 보장하기 위해 주로 사용되는 알고리즘이다.
원본 데이터(메시지)를 입력받아 고정된 길이의 고유한 해시 값을 생성한다.

MD5 해시의 결과는 항상 128비트이며, 보통 32자리의 16진수 문자열로 표현된다.
작은 변화라도 완전히 다른 해시 값을 생성하므로 데이터가 조금이라도 변경되면 감지할 수 있다.

하지만, MD5는 충돌이 발생하기 쉬워 보안 약점이 있다고 알려져 있다.
즉, 서로 다른 두 데이터가 동일한 해시 값을 가질 수 있다.
이러한 이유로 MD5는 더이상 안전한 해시 알고리즘이라고 보기 어렵다.

아래 코드는 message라는 변수가 가진 문자열을 CryptoJS로 MD5 해시를 계산하고 출력하는 예시이다.
✔ SHA-256
SHA-256(Secure Hash Algorithm 256)은 SHA-2 해시 함수에 속하는 알고리즘이다.
SHA-256도 MD5와 마찬가지로 원본 데이터를 입력받아 고정된 길이의 고유한 해시 값을 생성한다.

SHA-256 해시의 결과는 항상 256비트이며, 이는 64자리의 16진수 문자열로 표현된다.
SHA-256은 MD5보다 강력한 보안성을 제공하며, 현재까지 충돌을 찾는데 성공한 경우가 없다고 한다.
따라서, SHA-256은 MD5보다 안전한 해시 알고리즘이라고 할 수 있다.

아래 코드는 message라는 변수가 가진 문자열을 CryptoJS로 SHA-256 해시를 계산하고 출력하는 예시이다.
위 예시들 외에도 다양한 암호화 알고리즘을 제공하며,
실제 애플리케이션에서는 복잡한 암호화 및 해시 구현을 위해 이러한 기본 기능을 확장하거나 조합하여 사용해야할 것이다.
필자의 경우엔 AES 암호화/복호화 기능을 사이드 프로젝트할 때 유용하게 사용했었다.
Secret key
AES 알고리즘을 사용할 때 secret key를 사용하는데(보통은 환경변수로), 이 CryptoJS의 secret key에서는 특별한 형식의 규칙을 요구하지는 않지만 참고용으로 secret key를 설정할 때 따르는 몇가지 특성에 대해서 간단하게 알아 보았다.
✔ 충분히 길어야 한다.
키의 길이가 짧으면 브루트 포스(brute force) 공격에 취약하게 된다.이는 공격자가 가능한 모든 키를 시도해 보는 방식의 공격이다.

✔ 복잡해야 한다.
비밀 키는 예측이 어려워야 한다.
단순한 패턴, 연속된 숫자, 사용자의 개인 정보(생일, 전화번호 등)를 키로 사용하면 공격자에게 쉽게 추측될 수 있다.

✔ 안전하게 보관한다.
비밀 키는 안전한 방식으로 보관하고, 공유되어서는 안 된다.
키를 누설하면 데이터의 보안이 의미 없어진다.

✔ 유니크해야 한다
가능한 각 세션, 각 사용자 또는 각 애플리케이션에 대해 고유한 키를 사용해야 한다.
이렇게 하면 한 키가 노출되더라도 시스템의 다른 부분이 보호될 수 있다.
이번 포스트에서는 CrytoJS에 대해 간단하게 알아보았다.
다른 암호화 알고리즘도 있긴 한데 나머지는 나중에 시간 내서 공식 문서에서 확인해 봐야겠다.
필자의 경우 웹 개발이 직업이 아닌지라 사실 접해볼 일이 딱히 없었다.
완전 내 개인 사이드 프로젝트를 하다가 암호화가 필요한 경우가 있었어서 알게 되었는데,
다음 사이드 프로젝트를 진행할 때는 당황하지 않고 CryptoJS부터 찾아야겠다.
반응형

loading