(Crypto) 해시(hash)란?

Su Bak
4 min readAug 11, 2019

--

해시(hash)란 단방향 암호화 기법으로 해시함수(해시 알고리즘)를 이용하여 고정된 길이의 암호화된 문자열로 바꿔버리는 것을 의미합니다.

해시함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수입니다. 이 때 매핑 전 원래 데이터의 값을 키(key), 매핑 후 데이터의 값을 해시값(hash value), 매핑하는 과정을 해싱(hashing)이라고 합니다.

위의 주소에로 들어가시면 hash값을 만들어주는 사이트에 접속하실 수 있는데요. 입력값이 바뀔 때마다 hash값이 바뀌는 것을 볼 수 있습니다.

해시 알고리즘은 종류가 다양하고 알고리즘마다 hash 길이가 다릅니다. 해시알고리즘은 모두에게 공개되어있습니다. 즉, 해커에게도 공개되어있다는 말이기도 하죠. 그래서 이미 보안이 뚫린 해시 함수가 존재하는데요. MD5, SHA-1, HAS-180은 사용해선 안됩니다. SHA-256, SHA-512 등을 사용하기를 권고하고 있습니다(SHA-512가 더 좋다고 합니다).

해시 알고리즘은 특정 입력에 대해 항상 같은 해시 값을 리턴하기 때문에 이를 이용해 인증이 가능합니다. 어떤 입력인지 몰라도 해시함수를 이용해서 해시된 값이 일치하면 입력이 같다는 것이 인증되는 것이죠.

입력은 만들어낼 수 있는 값의 길이제한이 없어 무한정으로 만들 수 있지만 해시값은 항상 고정된 길이의 값으로 나타나기 때문에 한계가 있습니다. 그래서 다른 입력이지만 같은 해시값이 나오는 경우가 있을 수 있습니다(중복이 적게 나타날 수록 좋은 해시함수입니다).

단순히 해시 함수를 이용해서 변환한다고 해서 완벽하지 않습니다. 해커가 무차별적으로 임의의 값을 입력하면서 입력된 값을 알아낼 수 있으니까요. 이 점을 보완하기 위해 비밀번호에 솔트(salt)라는 특정 값을 넣는 방법이 있고, 해시 함수를 여러번 돌리는 방법이 있습니다. 두가지 방법을 합하여 입력값에 salt값을 붙여서 여러번 반복 해싱할 수도 있습니다.

Node.js에 crypto라는 내장 모듈이 있는데요. crypto 모듈의 pbkdf2메소드 사용 예시를 소개하겠습니다. pbkdf2는 단방향 암호화에서 많이 사용하는데요. pbkdf2 메소드는 입력값(secret), salt, 해시 함수 반복 횟수, 해시 알고리즘 이렇게 5개의 인자를 받습니다.

const crypto = require('crypto');
crypto.pbkdf2('secret', 'salt', 100000, 64, 'sha512', (err,
derivedKey) => {
if (err) {
throw err;
}
console.log(derivedKey.toString('hex')); // '3745e48...08d59ae'
});

위 예시에서 해싱에 성공하면 Buffer형태로 callback으로 넘겨주기 때문에 derivedKey.toString(‘hex’) 이렇게 hex 방식으로 문자열로 만들어 주어야 합니다(base64도 많이 사용합니다. base64, hex는 인코딩 방식입니다).

해시함수는 암호화를 위한게 아닌 검색을 위해 만들어졌기 때문에 매우 빨라서 10만번을 반복해도 1초도 걸리지 않습니다. 1초가 걸릴 때까지 반복횟수를 늘리는 것도 좋은 방법 중에 하나입니다.

이번 글에선 해시란 무엇인지와 Node.js의 crypto모듈의 예시를 알아보았습니다.

감사합니다.

--

--

Su Bak

Backend Developer. Mainly use JavaScript but try not to have language constraints. Always trying to acquire new knowledge