본문 바로가기
프로그래밍/database

[220302] 암호화 (buffer, hash, salt)

by 한코코 2022. 3. 2.

Buffer란?

어떤 텍스트를 저장하는 비트를 16진수로 표현한 것을 담는 것

ingoo의 16진수 아스키 코드값은 69 6e 67 6f 6f

버퍼에 텍스트를 담은 값을 확인하면 아스키 코드값과 같이 나온것을 확인할 수 있다.

const name = 'ingoo'
const buf = Buffer.from(name)
console.log(buf)

//출력
//<Buffer 69 6e 67 6f 6f> 총 6바이트 사용중

모든 프로그램은 데이터를 조작하기위해서 버퍼를 가지고있다.

그렇기때문에 브라우저에서 사용하는 자바스크립트에는 버퍼가 없고,

자바스크립트에서 분리되어 나왔지만 컴퓨터를 조작하기 위해서 만들어진 Node.js에는 버퍼가 있다.

 

근데 16진수는 길이가 길어서 데이터를 많이 차지해 가성비가 안 좋다.

대신해서 사용하는게 64진수.

const base64 = Buffer.from(name,'base64')
console.log(base64)

//결과
//<Buffer 8a 78 28> 총 4바이트 사용중

 

 

인코딩과 디코딩

인코딩 : 진수로 바꾸는 행위

디코딩 : 원상태로 바꾸는 행위 -> toString : 원본으로 변환해준다.

const name = 'ingoo'
const buf = Buffer.from(name)
console.log(buf.toString())

//출력
//ingoo

기본적으로 string은 utf-8으로 글자세팅이 되어있다.

(utf-8 그룹 안에 아스키 코드가 들어있다고 생각하면 됨.)

글자세팅을 잘 알아둬야 나중에 텍스트가 깨져도 당황하지 않고 수정할 수 있다.

const a = '10'
console.log(Buffer.from(a))
console.log(Buffer.from(a,'uft-8'))
//기본 프리셋이므로 결과는 같다

 


 

암호화

1) 양방향 : 규칙이 있고 암호화된 내용을 다시 원본으로 복구할 수 있을때 (=복호화)

2) 단방향 : 규칙이 있고 암호화된 내용을 다시 원본으로 복구할 수 없음

 

hash(해시) 만드는 법

hash(해시) : 단방향 암호화 & 암호화를 해서 고정된 자릿수를 줌.

  • 조건 1) 해시를 만들거다. --> node.js는 암호화를 만들 라이브러리를 기본적으로 갖고있다. --> crypto
  • 조건 2) sha256 방법으로 암호화를 할거다 --> createHash('sha256')
  • 조건 3) name이란 변수 안에 있는 텍스트를 암호화할거다. --> .update(name)
  • 조건 4) 16진수로 만들거다. --> .digest('bash16')

위 조건들을 충족시키는 해시를 만드는 코드를 짜면 아래처럼 나온다.

crypto.createHash('sha256').update(name).digest('bash16')

bash16과 hex의 차이점

bash16 : 버퍼에 넣어서 돌려줌

hex : string에 넣어서 돌려줌

const crypto = require('crypto')
const name = 'ingoo'

const sha256 = crypto.createHash('sha256').update(name).digest('bash16')
const sha256_2 = crypto.createHash('sha256').update(name).digest('hex')

bash16과 hex의 차이점


hash의 완벽하지 않은 보안성

1) 해시값을 탈취할 수도 있음

2) 대입으로 해결할 수 있음

 

보안성 보완법

1) 회원가입할때 패스워드를 해시로 변환해서 db에 넣음.

2) 사용자가 로그인할때 패스워드를 입력해서 백엔드에 넘겨주면 해시값을 만듬

3) 1번에서 만든 기존 패스워드랑 2번에서 입력한 패스워드를 각각 해시값으로 만들어서 서로 비교함

 

나만의 해시값, salt

salt를 넣어줘서 나만의 규칙, 나만의 해시값을 만들 수 있다.

const salt = 'web772'
const hash1 = crypto.createHash('sha256').update(name).digest('hex')
const hash2 = crypto.createHmac('sha256',Buffer.from(salt)).update(name).digest('hex')

console.log(hash1,hash2)
console.log(hash1===hash2)

//결과
//a10cef183e6605268b84dee6c569ae886bd672db192a28abdbdb9e11a61fb9d9
//219f44122f8d7bbab3d43519c5c8cf02f351cf836e9bfde9be8dde88f9c3d86b
//false

댓글