티스토리 뷰
요즘은 간편 로그인(구글 로그인과, 네이버 로그인 등을 이용한 외부 서버 인증 방식)으로 처리하는 곳이 많지만
해외 거주자가 있거나, 서비스의 고객층에 따라 간편 로그인이 낯설고, 예전 방식의 ID와 PW를 선호하는 사람들도 있기 때문에
요구사항에 따라 ID와 PW 방식의 회원가입을 구현해야 하는 경우도 존재한다.
우리는 종종 DB가 털려서, 개인정보가 유출 됐다는 뉴스를 접하곤 한다.
일반적으로 사람은 ID와 PW를 대다수의 사이트에 동일하게 사용하곤 한다.
하나의 사이트가 털려버리면, 내가 가입한 대다수의 사이트도 털려버릴 수 있기 때문에 큰 문제가 된다.
이 때문에 암호화에 관심이 생기게 되었고, 이번 포스팅에서는
어떻게 패스워드를 암호화해야 안전한지,
어떤 이유로 암호화 방식이 발전해 왔는지
암호화에 대한 감을 잡아보자는 취지로 작성하게 되었다.
🌠 목차
✅ 암호화 종류
✅ 양방향 암호화 특징
✅ 단방향 암호화 특징
✅ salt란?
✅ etc(SHA256의 크기는 어떻게 될까? 해시충돌이란?)
암호화 종류
암호화의 경우는 크게 양방향 암호화와 단방향 암호화가 존재한다.
다음 그림을 눈에 익히고 양방향과 단방향에 대해 알아보자.
양방향 암호화 특징
공통점: 동일한 키를 통해 암호화/복호화 가능
대칭키(비공개키) 특징
- 암호화 / 복호시 같은 키 값 사용
- 단점: 비공개 키이므로 암호화키 전달 문제 발생
- 종류: AES, DES
비대칭키(공개키) 특징
- 암호화 / 복호시 키 값 다르게 사용
- 암호화 키를 네트워크로 전달 가능
- 종류: RSA, DSA
암호화 key 종류는 public 하거나 private 하게 사용하는 경우가 존재한다.
때문에 확장성이 있는 개발을 할 때 대칭키를 사용하면 내부적으로 전달할 때 문제가 발생한다.
예를 들어 여러 SI 업체가 xx에 들어가서 개발을 할 때
A회사가 B회사, C회사, D회사가 상주해 있는 xx 프로젝트에서
회원가입을 위해 대칭키를 사용했을 때 암호화키 전달 시 문제가 발생한다.
또한 키가 유출되거나, 관리하기에 어려움이 존재하기 때문에 단방향 암호화로 발전되었다.
사용처: 쿠폰 발급 서비스 등(기프티콘)
단방향 암호화 특징
- 해시 알고리즘을 사용한다.
- 특징: 암호화 하면 복호화 불가
- 종류: SHA256, SHA512
- 사용: checksum(중복검사), 패스워드 검증, 민감데이터 보증
단방향 암호화는 해시 알고리즘을 사용한다.
* 해시란 임의 값을 넣어도 고정된 길이의 값으로 매핑하는 알고리즘이다.
예를 들어 SHA 256 알고리즘을 통해 암호화를 한다고 가정하자.
100글자를 입력하던 2글자를 입력하던
고정된 64자리, 16진수, 256bit가 나온다.
복호화가 불가능한 이유
SHA256 알고리즘을 사용할 경우 고정된 길이가 나온다.
한글은 한 글자당 16bit
영어는 한 글자당 7bit, 8bit이다.
즉 우리가 다양한 조합의 100 자릿수 pw를 입력하던, 1000 자릿수를 입력하던
SHA256을 사용하면 고정된 bit와 고정된 자릿수가 나온다.
해시 알고리즘을 사용하면서 데이터 손실이 일어나기 때문에 복호화가 불가능하게 되는 것이다.
이를 통해 추측해 볼 수 있는 것은
네이버에서 '비밀번호 찾기' 기능을 눌렀을 때 비밀번호를 알려주는 것이 아닌,
새로운 비밀번호를 생성하게 만든다.
그 이유가 아마, 복호화가 불가능한 단방향 암호화 방식을 사용하고 있기 때문이라고 추측해 볼 수 있겠다.
해시 생성기 사이트를 통해 내 PW는 어떤 해시 값을 만드는지 테스트를 해보자
https://ko.rakko.tools/tools/10/
그렇다면 단방향 암호화만 사용하면 복호화를 할 수 없으니 안전할까?
단방향 암호화의 문제점
'레인보우 테이블의 존재'
- 해시함수(MD-5, SHA-256등)를 사용하여 만들어낼 수 있는 값들을 대량으로 저장한 데이터 표를 의미한다
DB를 해킹하고, 해시함수로 저장되어 있는 PW 데이터를 레인보우 테이블과 비교해 버렸을 경우
일치하는 경우가 존재한다면, 해커는 해당 PW를 알 수 있다.
이렇게 되면 결국 단방향 암호화도 안전한 방식은 아니라고 할 수 있다.
그래서 단방향 알고리즘의 발전을 통해
salt라는 개념이 나오게 된 것이다.
Salt 란? (단방향 암호화 + Salt)
Salt(양념을 치자)
salt는 소금이라는 뜻으로 기존의 비밀번호에 양념을 친다고 생각하자.
유저가 회원가입 시 입력한 PW + 특정 문자열(salt)을 조합 -> SHA256 알고리즘을 통해 해시함수로 만드는 것이다.
다음의 이미지를 보면 더 쉽게 이해가 될 것이다.
쉽게 생성할 수 있는 pw: 123123은 sha256을 이용하면 다음과 같은 해시 값으로 만들 수 있다.
96cae35ce8a9b0244178bf28e4966c2ce1b8385723a96a6b838858cdd6ca0a1e
만약 레인보우 테이블에 의해 만들어둔 해시값과 123123의 해시값이 일치하면
해당 pw는 123123으로 알 수 있다.
그러나 서버단에 임의의 문자열을 생성해 두고 유저가 입력한 pw에 문자열 salt값을 더하여
해시값을 생성한다.
나의 경우는
123123 + fuxxhackerbyehacker1@!(salt값) 조합으로 해시값을 생성했다.
이렇게 하면 레인보우 테이블의 해시값에도 걸리지 않기 때문에 보안적으로 안전하다.
Salt 조합의 PW 테스트해 보기
궁금하다면 아래 사이트에서 테스트 해보길 바랍니다.
rainbow table 사이트. https://crackstation.net/
SHA256 암호화로 해시값 만드는 사이트. https://ko.rakko.tools/tools/10/
순수 PW(123123)의 결과
레인보우 테이블을 확인할 수 있는 사이트에서
96cae35ce8a9b0244178bf28e4966c2ce1b8385723a96a6b838858cdd6ca0a1e 를 넣으면
Type과 Result값이 무엇인지 바로 알려준다.
PW + Salt 결과
입력한 값 123123과 fuxxhackerbyehacker1@! 의 조합의 경우
rainbow table에 존재하지 않는 PW라고 나온다.
이렇게 유저가 입력한 PW + salt 값을 통해 해시값을 DB에 저장하고,
로그인 시 PW + salt 값으로 변환한 해시값이 DB에 존재하는 해시값과 일치할 때
로그인 성공을 보여주면 안전한 암호화 방식이 된다.
암호화를 공부하면서 읽어보면 좋을 글
* SHA256은 얼마나 큰 숫자일까?
암호화를 하면서 sha256, sha512등을 많이 접해 봤을 것이다.
이게 얼마나 큰 숫자인지 궁금해한 적 있는가?
2비트
2비트는 2개의 비트로 표현할 수 있는 값의 개수를 나타낸다.
각 비트는 0 또는 1의 값을 가질 수 있으므로, 2비트로 표현할 수 있는 값의 개수는 2의 2승과 같다.
즉
0 0
0 1
1 0
1 1
총 4가지를 표현할 수 있다.
4비트
0 0 0 0
0 0 0 1
0 0 1 0
0 1 0 0
.
.
1 1 1 1
총 16가지의 경우의 수가 존재한다
이런 식으로
32bit는 2의 32승 = 약 42억 가지의 경우의 수가 존재한다
64bit는 2의 64승 = 약 1800경 가지의 경우의 수가 존재한다
SHA256은 256bit이므로
2의 256승 즉
1800경^4의 경우의 수가 나온다.
이 경우의 수 중
같은 경우가 존재할 수도 있는데 이를 해시충돌이라고 한다.
* 해시 충돌이란?
서로 다른 입력 데이터를 입력했는데 동일한 해시값이 나오는 것을 의미한다.
입력데이터는 무한하고, 해시로 표현할 수 있는 값은 유한하기 때문이다.
예를 들어보자. (축덕이라 예시는 이해 바랍니다.)
손흥민의 ID는 '손흥민발롱도르'이고 PW는 '헬로우토트넘'이다.
모우라의 ID는 '모우라헤트트릭'이고 PW는 '굿바이토트넘'이다.
손흥민이 득점왕 이후 반응을 보려고 모우라 pc에서 로그인을 시도했다.
이전에 모우라가 사용했던 ID에
PW를 '헬로우토트넘'이라고 입력했는데
'굿바이토트넘'의 해시값과 '헬로우토트넘'해시값이 일치하여 로그인이 되는 경우가 발생할 수 있다.
정말 말도 안되는 경우의 수가 일치하는 경우를 해시충돌이라고 한다.
도움이 되었다면 좋아요👍 또는 댓글 부탁드립니다.
포스팅에 큰 힘이 됩니다!
감사합니다 ^^
* 해당 포스팅에 사용된 이미지는 제가 직접 제작했습니다.
* 퍼가실 때 댓글 남겨주세요.
'💻 개발 > DB&서버&네트워크&암호' 카테고리의 다른 글
- Total
- Today
- Yesterday