2024. 12. 1. 23:50ㆍ프로그래밍/Node
개요
API 사용을 위해 요청 헤더 조건으로 crypto js를 통한 암호화가 필요했다.
기존의 javascript 코드로 작성된 레퍼런스는 많았으나 '@types/crypto-js'를 사용하게 되면 CommonJS 모듈 방식을 사용하지 않기 때문에 라이브러리 분석을 통해 기존 코드를 타입스크립트에 호환되게끔 치환한다.(GPT를 사용하면 편하게 변환해줄 수 있긴 하겠다만 사용을 지양하는 편이라..크흠)
과정
기본적으로 알아야 할 지식은 Crypto JS가 어떤 과정을 통해 암호화 하는가이다.
1. SHA256, 512, HMAC 등 여러가지 암호화 알고리즘을 통해 해쉬값을 생성함
2. 생성해낸 해쉬값을 32비트의 고정 길이 단어 배열을 생성해낸다.
3. 생성된 단어배열을 인코딩(UTF-8, UTF-16, HEX)을 통하여 최종적으로 암호화된 문자열을 생성한다.
기존코드
# For Javascript
const alg = 'SHA512'
const hash = crypto.createHash(alg)
const queryHash = hash.update(query, 'utf-8').digest('hex')
# For Typescript
const hash =cryptoJS.algo.SHA512.create();
const queryWordArray = hash.update(query).finalize();
const queryHash = queryWordArray.toString(cryptoJS.enc.Hex)
// 혹은
const queryHash = cryptoJS.enc.Hex.stringify(queryWordArray);
기존의 digest 메서드가 finalize로 대체되었다.
후기
개인적으로는 이전 코드가 훨씬 간결하고 사용감이 좋은 것 같다.
어찌됐건 직접 분석해보니 기존에 잘 모르던 namespace 문법에 대해서도 이해도가 올라간 거 같다.
또한 npmjs나 github에 샘플 코드가 잘 정리된 라이브러리도 있지만 대부분 그렇지 않은 경우가 많으며 공식문서보다도 라이브러리를 직접 까보는 편이 시간은 더 걸리더라도 도움이 될때가 훨씬 많다. TypeOrm은 하도 많이 봐서 적응이 됐지만 새로 분석하는 라이브러리에 한해서는 시간이 좀 걸리는 거 같다.
'프로그래밍 > Node' 카테고리의 다른 글
[ Node ] Mysql 라이브러리에서 Sql Injection 예방을 위한 파라미터 바인딩 (0) | 2024.07.17 |
---|