-
[웹개발] Client - Server 간 pw 구간 암호화하기(SHA-256 + SALT)개발기록 2023. 1. 2. 21:47반응형728x90
개요
패스워드의 경우 관리자든 누구든 사용자 본인을 제외하고는 모르게 하는 게 맞다.
따라서 서버에서도 복호화되어서는 안 되기때문에 단방향 암호화를 할 때 쓰는 SHA-256 알고리즘을 사용하여 해싱한다.
로그인할 때, 클라이언트에서 해싱한 pw 값을 서버에게 넘겨주면 서버는 단순히 DB에 있는 값과 비교만 하는 역할을 수행한다.
SHA-256
해시 알고리즘 종류 중 하나로 암호화된 문자열을 다시 평문으로 복호화 할 수 없다는 특징이 있다.
또한 같은 문자열을 넣으면 같은 해시 값으로 암호화해준다.
문제는 이 알고리즘이 대중에게 공개되어있기 때문에 해커들이 미리 문자열들을 해싱해두고 비교해볼 수도 있다.
- 이와 관련된 개념으로 레인보우 테이블(rainbow table)이 있다.
레인보우 테이블 개념 참고: https://h1ggs.tistory.com/m/2
따라서 우리는 이를 보안하기 위해 Salt라는 개념을 알아야한다.
※ 아래는 SHA-256 해시 알고리즘 과정에 대한 설명이 정리되어있는 블로그이다.
https://losskatsu.github.io/blockchain/sha256/
[블록체인] SHA-256 해시 알고리즘에 대해 알아보자
“[블록체인] SHA-256 해시 알고리즘
losskatsu.github.io
cf) 해시 알고리즘마다 Hash 길이가 다르고 이미 보안이 뚫린 해시 함수가 존재한다.
ex) MD5, SHA-1, HAS-180
따라서 이들을 제외하고 아직 안 뚫리고 보안이 인증된 SHA-256, SHA-512 등을 사용하자!
출처: https://velog.io/@mingtorr/Node.js-비밀번호-암호화하기
Salt
Salt 기법은 해싱할 문자열에 소금을 쳐서 복잡도를 높이는 것이다.
즉, 문자열 + Salt를 해싱하여 같은 문자열이더라도 해싱된 해시 값이 달라진다.
이렇게 할 경우 문자열과 해당하는 해시값으로 만들어진 레인보우테이블에 대해 안전해진다.
또한 만약 동일한 비밀번호를 쓰고 있던 유저들이 있다면, 그 유저들 중 한 명이 비밀번호를 탈취당하더라도 다른 유저들의 비밀번호는 탈취당하지 않을 수 있고 피해를 최소화할 수 있다.
SHA-256과 Salt 적용방법
여러 개의 글들을 살펴봤을 때, Salt를 랜덤으로 발생시켜 암호화할 문자열과 함께 해싱하는 것을 알아볼 수 있었다.
이렇게 할 경우 유저별로 Salt값들을 잘 저장해야한다고 한다.
- DB에 저장할 경우, 로그인 할 때마다 DB에서 해당 id의 Salt를 가져오고 난 다음에 로그인을 해야한다.
- LocalStorage 어딘가에 저장할 경우, XSS 공격 등으로 인해 탈취될 가능성이 있다.
이 두가지를 생각했을 때 Salt를 따로 생성하고 저장하는 방법은 개인적으로 현재 지식수준에서는 효율적이거나 안전하지 않다고 생각되어서 유저별로 Salt로 쓰일 유니크한 값들이 무엇이 있을까를 고민하게 되었다.
따라서 id와 pw를 붙여 Salt를 만들어 사용하기로 했다.
이렇게 할 경우 앞서 들었던 1, 2번에 대한 문제를 해결할 수 있고 Salt를 통해 같은 비밀번호를 쓰는 유저들이 있다고 하더라도 서로 다르게 해싱될 것이기 때문이다.
참고로 구현 코드는 crypto모듈을 사용했으며, 다음에 기회가 되면 이 글에 이어서 올리도록 하겠다.
728x90'개발기록' 카테고리의 다른 글
[MyBatis] 쿼리문에서 >, < 등 부등호 사용하기 (0) 2023.03.06 [웹개발] 이미지 업로드 후 새로고침해야만 적용되는 현상 해결하기 (2) 2023.01.13 [Regex] 정규식 / 정규표현식 (Regular Expression, Regex) (0) 2022.12.23 [Spring Boot] boolean값이 0 또는 false만 return할 때 해결 방법 (0) 2022.11.02 [Spring Boot] Real Remote(Client) IP Address 얻기 (1) 2022.10.11