일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 백준골드
- HTML
- 백준구현
- js코테
- JS프로그래머스
- 코딩테스트
- 리액트커뮤니티
- dp알고리즘
- 코테
- 다이나믹프로그래밍
- 익스프레스
- 백준js
- HTML5
- JS
- 포이마웹
- 백준nodejs
- css기초
- CSS
- 알고리즘
- 안드로이드 스튜디오
- 몽고DB
- 백준구현문제
- 리액트댓글기능
- 백준
- 리액트
- 프로그래머스
- 프로그래머스코테
- 백준알고리즘
- 프로그래머스JS
- 자바스크립트
- Today
- Total
개발새발 로그
[2023-09-21] TIL - 암호화 본문
암호화
- 평문(Plaintext)을 해독할 수 없는 암호문(Ciphertext)로 변환하는 것을 의미
- 단방향(해싱)과 양방향 암호화가 존재한다.
단방향 암호화
- 해시알고리즘을 이용하여 평문을 복호화할 수 없는 형태로 암호화 한다.
- 보통 사용자 비밀번호를 저장할 때 사용 -> 저장하는 측에서도 해당 데이터를 모르게 하도록 하기 위해
- 대표적으로 MD5와 SHA 알고리즘이 있다.
단방향 암호화에서 고려할 점
-해킹공격 중 Rainbow Table에 대비해야한다.
-Rainbow Table은 평문과 해시 함수로 만든 문자열을 모두 저장시켜놓은 표를 말한다.
-만약 암호화된 데이터를 탈취당했을 때 해커들은 미리 평문 데이터들을 해시 알고리즘을 통해 DB에 저장해놓은 것들을 사용한다. 그 후 탈취한 데이터에 대입하여 원문을 알아낼 수 있다.
- 따라서 암호화된 데이터를 탈취당하더라도 원문을 알아낼 수 없도록 조치해야한다.
- Salt, Key stretching을 이용하여 해결한다.
Salt
- 평문에 임의의 문자열을 추가하여 암호화하는 방법
- Salt는 128bit 이상으로 만들 것을 권장
Key stretching
- 해시를 여러번 반복하여 원문을 알기 힘들게 만드는 방법
- 일반적인 시스템에서 0.2초 반복되면 안전하다고 한다.
Salt와 key stretching을 이용하는 알고리즘
- 직접 구현하는 것보다 이미 검증받은 알고리즘을 사용하는 것이 안전하다.
- PBKDF2
-NIST(미국표준기술연구소)에서 승인된 알고리즘
- bcrypt
- 비밀번호 저장을 목적으로 탄생
양방향 암호화
- 평문을 복호화 할 수 있는 형태로 암호화하는 방법
- 대칭키와 비대칭키 알고리즘으로 나뉜다.
- 대표적으로 대칭키를 이용하는 AES와 비대칭키를 이용하는 RSA로 나뉜다.
대칭키 암호 알고리즘
- 대표적으로 AES가 있다.
- 같은 키를 이용하여 암호화, 복호화가 가능하다,
비대칭키 암호 알고리즘
- 대표적으로 RSA가 있다.
- 공개키와 개인키 두가지 키가 존재한다.
- RSa는 소인수 분해를 기반으로 만들어진 알고리즘이다.
비대칭키 암호 알고리즘이 탄생한 이유
- 대칭키 암호화만으로는 다수를 대상으로 암호문을 받기 힘들기 때문이다.
- 모든 사람이 대칭키를 알아야 하는데 이는 보안에 위협이 발생한다.
- 반면 비대칭키 암호화는 모든사람이 접근해도 상관없는 공개키와 사용자만이 알고있는 개인키를 이용하여 다수를 대상으로 하기에 더 안전하다.
-> 이러한 방식으로는 HTTPS에서도 사용된다.
요즘 브라우저는 비밀번호를 자체적으로 저장하고, 자동완성을 해준다.
이때 브라우저는 비밀번호를 어떻게 저장할까?
1password처럼 여러사람이 같은 비밀번호를 공유하는 경우에는 어떻게 하는 걸까?
1. 사용자 이메일과 비밀번호를 이용하여 Master Unlock Key 생성
2. Master Unlock Key는 AES의 대칭키가 된다.
3. 다음으로 자동생성한 평문을 AES를 통해 암호화하고 서버에 저장한다. - 여기서 기존 평문은 PGP의 암호를 이용
4. 이후에 평문 정보를 제거하여 아무도 알 수 없게 한다.
5. 여기서 생성된 개인키는 사용자에게 전달하고 공개키는 서버에 저장한다.
6. 이후에 데이터를 PGP 공개키를 이용하여 암호화 할 수 있다. - 참고로 PGP는 여러개의 공개키를 이용해 암호화가능
7. 이때 각 공개키와 대응되는 개인키로 복호화가 가능하다.
8. 이런방식으로 여러 기기 혹은 권한별로 조정이 가능
JavaScript에서 암호화를 이용하는 방법
- crypto-js를 사용
- crypto-js에 bcrypt는 구현되어있지 않아 다른 라이브러를 알아봐야한다.
'TIL' 카테고리의 다른 글
[2023-09-21] TIL - 객체지향과 프로토타입 (0) | 2023.09.21 |
---|---|
[2023-09-21] TIL - 함수형 프로그래밍 (0) | 2023.09.21 |
[2023-09-21] TIL - 컴퓨터 시간 원리 (0) | 2023.09.21 |
[2023-09-21] TIL - 네트워크 기초 (0) | 2023.09.21 |
[2023-09-20] TIL - 스코프와 클로저 (1) | 2023.09.20 |