암호화
const shiftBy = (content, offset) => {
return content.split("").map(letter => {
return String.fromCharCode(letter.charCodeAt() + offset)
}).join("")
}
shiftBy("cat", 2)
shiftBy("cat", -2)
- 암호화(encryption) : 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환 후 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 알고리즘을 이용해 정보를 관리하는 과정
1. Hashing
1) 개념
- 암호화의 기본으로, 어떠한 문자열에 임의의 연산을 적용하여 문자열로 변환하는 것
- 항상 똑같은 결과를 내며 사실상 복호화가 불가능
*1q2w3e4r처럼 뻔한 password같이 레인보우 테이블에 기록된 경우 값을 알 수 있음
- 해시 충돌 : 경우에 따라 다른 input임에도 똑같은 해시 값이 나올 수 있음
- 대표적 : SHA1, SHA256(최근 많이 사용)
- 적용 : 비밀번호에 대한 해시 값이 데이터베이스에 저장
*데이터베이스가 해킹되더라도 비밀번호 노출 방지
조건
- 모든 값에 대해 해시 값을 계산하는 데 오래 걸리지 않아야 함
- 최대한 해시 값 중복을 피해야 하며, 모든 값은 고유한 해시 값을 가짐
- 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 함
2) Salt
(1) 개념
- 암호화해야 하는 값에 어떤 별도의 값을 추가하여 결과를 변형하는 것
- 암호화만 해놓는다면 해시된 결과가 늘 동일하기 때문에 해시된 값과 원래 값을 테이블(레인보우 테이블)로 만들어 decoding 해버리는 경우도 생김
- 원본값에 임의로 약속된 별도의 문자열을 추가해 해싱 진행 시 기존 해시 값과 전혀 다른 해시 값이 반환되어 알고리즘이 노출되더라도 원본 값을 보호할 수 있도록 하는 안전장치
기존
: 암호화 하려는 값 > 해시 값
Salt 사용
: 암호화 하려는 값 + Salt용 값 > 해시 값
(2) 주의 사항
- Salt는 유저와 패스워드 별로 유일한 값을 가져야 함
- 사용자 계정을 생겅할 때와 비밀번호를 변경할 때 마다 새로운 임의의 Salt를 사용하여 해싱해야 함
- Salt는 절대 재사용하지 말아야 함
- Salt는 DB의 유저 테이블에 같이 저장되어야 함
*유저가 비밀번호 입력 시 해당 유저의 Salt와 비밀번호를 이용해 다시 해싱해줄 수 있음