안녕하세요
이 코드는 자바스크립트를 활용하여 SHA 256으로 문자열을 변환하는 코드입니다.
암호화 기반인 PSK, HASH 암호화는 단방향 해시를 기준으로 암호화를 수행합니다.
예를 들어 비밀번호를 저장한다고 한다면 'PASSWORD' 라는 문자열을 DB에 저장하면 DB가 유출되었을 때 사용자의 비밀번호가 원본 그대로 탈취되지만
SHA256을 활용하면 문자열이 SHA256 기반으로 '해시화' 됩니다. 즉, DB가 유출되더라도 '해시화'된 비밀번호를 해독하기 위해서는 RAINBOW-TABLE ATTACK 혹은 무작위 대입 공격 두 가지로 수행되나 이런 경우 100년 이상의 무지막지한 시간이 소요되는 문제로 인해 개인정보 유출을 방어할 수 있죠
https://www.convertstring.com/ko/Hash/SHA256
이 사이트에서 단방향 hash를 해시화해볼 수 있습니다.
예를 들어 PASSWORD 를 SHA256 알고리즘으로 '해시화' 하면 0BE64AE89DDD24E225434DE95D501711339BAEEE18F009BA9B4369AF27D30D60 다음과 같은 문자열과 숫자의 조합이 됩니다.
즉 원본 문자열인 PASSWORD 를 해석하기 위해서는 어떤 값을 때려넣어야 저 해시값이 나오는지 무작위 대입하는 방법뿐이죠
이것을 1차 암호화 한다라고 정의합니다
그렇지만 이런 공격에서 잘 사용되는 쿼티 (QWERTY12) 혹은 (PASSWORD) 같은 많이 사용되는 취약한 비밀번호의 경우 이미 대부분의 문자가 HASH 테이블로 만들어져 있어 해시값을 때려넣으면 이거랑 일치하는 문자를 찾아 주는 툴이 있습니다.
이게 바로 레인보우 테이블이죠 (RAINBOW-TABLE)
후추
후추는 고기에 양념하는 그거랑 비슷한 형태로 동작합니다.
이건 레인보우 테이블 공격을 방어하기 위해 만들어진 하나의 트릭이지만, 매우 간단한 방법으로 강력하게 동작합니다.
레인보우 테이블의 내부 구조는 다음과 유사한 형태가 많습니다
PASSWORD > 0BE64AE89DDD24E225434DE95D501711339BAEEE18F009BA9B4369AF27D30D60
12345678 > EF797C8118F02DFB649607DD5D3F8C7623048C9C063D532CC95C5ED7A898A64F
이런 식이고, 이 경우 'EF797C8118F02DFB649607DD5D3F8C7623048C9C063D532CC95C5ED7A898A64F' 라는 해시를 확보했다면 역으로 이게 12345678을 의미하는 것을 알 수 있죠.
그런데 여기에 특정한 문자열을 더했다고 해봅시다
예를 들어 'P1' 이라는 문자열을요
단지 원본 문자열 + P1을 해준 것 만으로도 해시값은 크게 달라지게 됩니다
PASSWORD + P1 > HASH :: E576119A8CEB732DCA179D2313C3D2CD195FFE71BE5578D5AED6DEC51A3131F7
PASSWORD > HASH :: 0BE64AE89DDD24E225434DE95D501711339BAEEE18F009BA9B4369AF27D30D60
즉, 기존의 레인보우 테이블이 쓸모없어지고 전부 때려맞춰야 하는 상황이 발생하는 거죠
코드
이 코드는 NEXT.JS 환경 (pages/api/crypterd.js) 라는 파일에서 api로 동작하며 문자열을 후추를 쳐서 암호화해 post 리턴하는 코드에 관한 것입니다 ( next.js에서 바로 db로 보내도 되지만, 기존에 구축된 API의 사용을 위해 별도로 post 전송됨 )
export default function handler(req, res) {
const crypto = require('crypto');
const password = req.body.encrypt;
const secret = 'P1';
const hashed = crypto.createHmac('sha256', secret).update(password).digest('hex');
console.log(hashed);
return res.status(200).json({ hash: hashed })
}
이 코드의 실행을 위해서는
npm install crypto
가 선행되어야 합니다