본문 바로가기
시작/TIL(Today I Learned)

230823 - 알고리즘 적용하는 위치에 따른 방법 3가지 (SHA-256)

by 백씨네 2023. 8. 24.

오늘 내가 배운 것

1. Node.js 환경

2. 브라우저 환경

3. crypto-js 라이브러리

4. Node.js VS 브라우저 VS 라이브러리 비교

 

 

블록체인을 하면서 해시 알고리즘을 이용하는 경우가 많이 있다. 그래서 오늘은 여러 암호화하는 방법 중 해시 알고리즘을 적용하는 위치에 따른 방법을 찾아봤다.

 

결론부터 말하자면 3가지가 있다.

  1. Node.js 환경에서 내장 모듈
  2. 브라우저 환경에서 API 사용
  3. 라이브러리 (Node 환경, 브라우저 환경)

암호화를 위한 여러 알고리즘, 방식이 있지만 SHA-256을 이용하여 해시 값을 얻는 예시로 진행하려 한다.

SHA-256 : 256비트의 해시 값을 생성하는 암호화 해시 함수, 해싱 알고리즘으로 한번 해싱된 데이터는 원래 데이터로 되돌릴 수 없다.

해싱된 데이터가 맞는지 확인하는 방법은 새로 입력받은 데이터를 해싱한 후 같은 기존에 저장하고 있는 데이터와 비교하여 입력받은 데이터와 저장 데이터가 서로 같은지 확인한다.

1. Node.js 환경

Node.js환경에서는 ‘crypto’ 내장 모듈을 이용해서 SHA-256 해시를 생성할 수 있다.

const crypto = require("crypto");

const sha256 = (data) => {
    const hash = crypto.createHash('sha256');
    hash.update(data);
    return hash.digest('hex');
}

const myData = 'baekspace';
const myHash = sha256(myData);

console.log(myHash);


2. 브라우저 환경

브라우저에서는 ‘subtleCrypto’ API를 이용하여 SHA-256 해시를 생성할 수 있다. - crypto.subtle.digest()

const sha256 = async (data) => {
    const msgUint8 = new TextEncoder().encode(data) 
    const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8)
    const hashArray = Array.from(new Uint8Array(hashBuffer)) 
    const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("") 
    return hashHex
}

const myData = 'baekspace';
sha256(myData).then(hash => console.log(hash))

처음 입력받은 값을 msgUint8 변수로 변환하는 이유는 문자열을 바이트 배열로 변환하여 해싱 알고리즘이 처리할 수 있는 형태로 변경시키기 위한 과정이다.

이후 해시화를 한 후 다시 uint8Array로 변환한 다음 문자열로 변경해 주는 과정을 거친다.



3. crypto-js 라이브러리

서버, 브라우저 모두에서 사용할 수 있는 라이브러리를 이용한 방식이다.

const CryptoJS = require("crypto-js");

const myData = 'baekspace';
const myHash = CryptoJS.SHA256(myData).toString(CryptoJS.enc.Hex);

console.log(myHash);



4. Node.js VS 브라우저 VS 라이브러리 비교

당연히 세 가지 모두 같은 결과를 보여준다.

각 특징을 살펴보면

  1. Node.js의 ‘crypto’ 모듈: Node.js의 내장 모듈이므로 추가적인 라이브러리 설치 없이 사용할 수 있으며, 성능도 최적화되어 있을 가능성이 높다. 서버 측에서 사용하는 경우에 적합
  2. 브라우저의 ‘subtleCrypto’ API: 브라우저가 지원하는 웹 암호화 API로, 클라이언트 측에서 안전하게 암호화 작업을 하고 싶을 때 사용할 수 있다. 브라우저에 최적화되어 있고, 웹 보안 관점에서 권장되는 방식
  3. crypto-js’ 라이브러리: 클라이언트와 서버 모두에서 사용할 수 있는 라이브러리이다. 사용하기 쉽고 다양한 암호화 옵션이 있지만 외부 라이브러리이므로 성능과 크기 측면에서 다른 방식보다 미세하게 떨어질 수 있다.

원래 알고 있던 방법은 Node.js 환경, 라이브러리를 이용해서 해싱하는 것이었는데, 이번에는 서버단까지 데이터를 str형태로 끌고 가서 변환하고 싶지 않았고, 블록체인 특성상 프론트에서 처리하는 방식이 옳다고 생각했기 때문에 브라우저에서 해싱하는 방법을 찾았던 것이다.

즉, 암호화 또는 해싱이 필요한 위치를 고려해서 사용해야 한다는 것이다.

 


 

댓글