사용자 정보에 대한 프로그래밍을 진행하면서 가장 기본적으로 염두에 두어야할 사항은 데이터의 안전한 저장이다.
데이터의 안전성을 높여주기 위한 가장 기본적인 방법은 암호화 및 해싱이다.
암호화와 해싱은 원래 데이터를 보호해준다는 기능을 제공하는 목적에선 동일하지만, 그 원리가 다르다.
해싱과 암호화는 다른 개념이기 때문에, 두 개념을 데이터 보호 방법이라 통칭해보겠다.
데이터 보호 방법은 크게 두가지로 나뉜다.
- 복호화(원래 데이터로 복구)를 하지 않는 hash
- 암호화/복호화 모두 진행할 수 있는 encryption(↔decryption)
복호화가 안되는 단방향 데이터 보호 방법
hashing은 단방향, 원래 데이터를 특정 알고리즘으로 변환한 데이터(일종의 문자열)만 제공해주는 알고리즘이다.
특정 알고리즘을 적용하여 원래 데이터를 문자열로 변환해주는데, 이 문자열은 다시 원래 데이터로 복구할 수는 없다.
따라서 hashing을 통해 변환된 데이터를 다시 복구할 수는 없으므로, 사용자가 비밀번호를 잊어버린다면 비밀번호를 신규 발급해야 한다.
다만 동일한 데이터에 대해선 동일한 결과(digest, 다이제스트)를 얻기 때문에, 원래 데이터에 대한 비교는 가능하다(=비밀번호 일치여부).
사실 1번의 Hashing으로는 허점이 많기 때문에, 이를 보완하기 위한 다양한 방법을 제시할 수 있다.
그 중 하나는 해싱반복, 말 그대로 해싱 알고리즘을 여러번 적용하는 것이다.
프로그래밍을 하면서 비밀번호의 일치여부만 파악하면 되는 경우, 이러한 hash algorithm을 여러번 적용하여 Hash의 허점을 보완할 수 있다.
또한 사용자의 비밀번호에 임의의 문자열을 추가하여 Hash를 적용하는 Salt algorithm이 있다.
음식에 소금을 치듯이, 기존의 데이터에 다른 문자열을 더해준다는 의미에서 유래되었다.
이 경우 같은 비밀번호를 입력하더라도, 임의의 문자열을 다르게 입력해준다면 다이제스트의 값은 달라진다.
따라서 프로그래밍을 하는 입장에서 이 임의의 문자열을 어떻게 기억하느냐가 비밀번호 복구를 할 때 중요하게 작용될 수 있다.
require('request-hash')
npm은 hash algorithm 기능을 제공해주는 module이 내장되어 있다.
const requestHash = require('request-hash');
let hash = requetHash({
serializer: JSON.stringify,
algorithm: 'md5'
});
Model.create({
userID: ID,
userPW: hash(PW)
})
암호화 관련 (hashing / encryption)
https://st-lab.tistory.com/100
hash 관련 개념
https://stackoverflow.com/questions/1240852/is-it-possible-to-decrypt-md5-hashes
hash algorithm
https://www.npmjs.com/package/request-hash