Skip to content

Commit

Permalink
Merge pull request #73 from 483759/main
Browse files Browse the repository at this point in the history
암호화 알고리즘 정리
  • Loading branch information
jjuyeon authored Nov 11, 2021
2 parents d364d6a + a24a68a commit 6e9daa9
Show file tree
Hide file tree
Showing 9 changed files with 482 additions and 16 deletions.
62 changes: 62 additions & 0 deletions algorithm/yij/Cryptography.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Cryptography - 암호화 알고리즘

암호화 알고리즘은 암호화/복호화에 사용되는 키, 그리고 양방향 가능 유무를 기준으로 분류할 수 있다.

<br>

## Symmetric-Key Algorithm

대칭 키 암호는 암호화 알고리즘의 한 종류로, 암호화와 복호화에 같은 암호 키를 사용하는 알고리즘을 의미한다.

암호화를 하는 송신자가 평문을 암호화 하고, 해당 암호 키를 공유해서 복호화를 하는 수신자는 암호문을 복원한다. 공유되는 암호 키를 **대칭 키**라고 한다.

공개 키 암호화 방식과 비교해서 계산 속도가 빠르다는 장점이 있지만, 같은 키를 공유해야 하기 때문에 언젠가 한 번은 키를 전달해야 하는데, 전송 과정에서 탈취당할 수 있다는 위험성이 있다.

<br>

## Public-Key Algorithm

![image](https://user-images.githubusercontent.com/30489264/140643139-8248db2f-da1c-4cb1-9836-390596a47194.png)

암호화와 복호화에 이용하는 키가 다른 방식을 말한다. 이 알고리즘은 공개 키 암호 또는 비대칭 암호라고 부른다.

두 개의 키를 사용하는데 전체에서 공유하는 암호 키를 **공개 키**, 특정 사용자만이 가지고 있는 암호 키를 **개인 키**라고 한다. 어느 하나의 키로 암호화한 암호문은 다른 쪽의 키로 복호화할 수 있다. 대칭 키 암호보다 복잡한 계산을 사용하기 때문에, 실제에서는 대칭 키 방식과 혼합해서 사용한다.

이 때 사용되는 방식은 두 가지가 있다.

### 공개 키 암호

공개 키를 이용해서 암호화하고, 특정 개인 키를 가진 사용자만이 해당 암호문을 복호화할 수 있다. 대칭 키를 이용했을 때의 단점인 키의 공유가 발생하지 않기 때문에 두 단말 간에 정보를 안전하게 공유할 수 있다.

> 1. A는 공개 키를 공개한다.
> 2. B는 공개 키로 전달하려는 평문을 암호화 한다.
> 3. B가 A에게 암호문을 전달한다.
> 4. A는 개인 키를 이용해서 암호문을 복호화한다.
### 공개 키 서명

개인 키를 이용해서 암호화하고, 공개 키를 이용해서 해당 암호문을 복호화할 수 있다. 누구나 해당 암호문을 복호화할 수 있으므로, 개인 키를 가진 사용자로부터의 신뢰할 수 있는 정보인지 검증하는 용도로 쓰인다.

> 1. A는 공개 키를 공개한다.
> 2. A는 평문을 자신의 개인 키로 암호화 한다.
> 3. 다른 사용자는 해당 암호문을 A의 공개 키를 이용해서 복호화한다.
> 4. 해당 문서가 변조되었다면 원래의 평문을 복원할 수 없으므로, 문서의 발행 출처와 변조 여부를 확인할 수 있다.
<br>

## 대칭 키 + 비대칭 키

대칭 키 방식과 공개 키 암호 방식의 장단점이 명확하기 때문에 두 방식을 혼합해서 사용한다.

1. 송신자 측에서는 대칭 키로 사용할 암호 키를 공개 키로 암호화한다.
2. 암호화된 대칭 키를 전송한다. 이 암호문은 수신자 측만 복호화할 수 있기에 탈취당해도 안전하다.
3. 수신자는 암호문을 복호화 해서 공개 키를 얻는다.
4. 송신자와 수신자가 공유한 대칭 키를 이용해서 이후에는 해당 대칭 키를 이용한 암호화 방식을 사용해서 통신한다.

<br>

## One-Way Encryption

![image](https://user-images.githubusercontent.com/30489264/140644145-735e0093-c662-4b42-8538-f04bc0cec6a2.png)

위의 두 암호화 알고리즘은 암호 키를 사용해서 평문을 암호문으로 암호화, 암호문을 평문으로 복호화할 수 있었다. 하지만 **Cryptographic hash function(암호화 해시 함수)를 사용한 단방향 암호화 방식**은 평문을 암호화한 뒤로는 복호화할 수 없는 암호화 방식이다. 이 암호화 방식은 패스워드 저장과 같이, 반드시 원본 데이터를 복원해내지 않아도 되는 경우에 사용한다(ex. 서버의 데이터베이스에 저장하는 패스워드는 복호화 될 필요가 없고, 사용자가 패스워드를 입력할 때 마다 암호화 한 값을 비교하면 된다).
120 changes: 109 additions & 11 deletions database/yij/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,52 @@
- contributor : [김경원](https://github.com/shining8543) , [윤이진](https://github.com/483759) , [이현경](https://github.com/honggoii) , [진수연](https://github.com/jjuyeon)
<hr/>

### :notebook_with_decorative_cover: 데이터베이스 성질

1. 데이터의 무결성에 대해 설명해주세요.

> 무결성이란 데이터의 정확성, 일관성, 유효성이 유지되는 것을 말합니다. 종류로는 개체 무결성, 참조 무결성, 도메인 무결성, 무결성 규칙이 있습니다.
2. 개체 무결성에 대해 설명해주세요.

> 모든 테이블은 기본 키로 선택된 필드를 가져야 합니다. 이는 유니크한 값을 가져야 하며, NULL은 허용되지 않습니다.
3. 참조 무결성에 대해 설명해주세요.

> 참조 관계에 있는 두 테이블의 데이터가 일관성을 유지하도록 하는 것을 의미합니다. 참조 무결성을 지키기 위한 기능으로는 RESTRICTED, CASCADE, SET NULL이 있습니다.
> 이것은 해당 레코드를 참조하고 있는 개체가 있을 때 변경이나 삭제를 금지할지, 동기화 할지, NULL로 만들지 결정합니다.
4. 도메인 무결성에 대해 설명해주세요.

> 필드 타입, NULL 허용, Default 등의 사항을 정의하고 이를 확인하는 것을 말합니다.
<br>

### :notebook_with_decorative_cover: 인덱스 (Index)
1. DB 인덱스에 대해 설명해주세요.
- 데이터베이스에서 풀 스캔이 아닌 레인지 스캔을 하기 위해 지정하는 자료구조.

> 데이터베이스에서 레코드를 조회할 때 풀 스캔이 아니라 범위 스캔을 하기 위해 지정하는 자료구조입니다. 인덱스를 사용할 경우 일반 테이블이 아닌 B-Tree로 구현된 파일에서 내용을 검색하기 위해 조회 속도를 증가시킬 수 있습니다.
<br>

2. DB 인덱스를 사용하는 이유는 무엇인가요?
- 테이블을 조회할 시 SQL문의 수정 없이 빠른 속도로 조회하기 접근하기 위해
3. DB 인덱스에 해쉬 보다 B Tree를 쓰는 이유는 무엇인가요?
- B+트리를 사용하게 되면 banlanced 성질이 유지되어 데이터의 속성에 관계 없이 일관된 시간복잡도 내에 조회 가능. 해쉬는 해쉬 버킷의 일부 영역에만 데이터가 집중되는 경향이 있어 cache miss가 발생할 확률이 높음.

> 자주 조회하는 컬럼을 인덱스로 등록하면 조회 속도를 상승시킬 수 있습니다. 단, 삽입과 삭제가 빈번하게 발생할 경우 성능 저하의 원인이 될 수 있으며, 카디널리티가 높은 컬럼에 인덱스를 지정해야 합니다.
3. 카디널리티가 무엇인가요?

> 컬럼의 값이 중복되지 않으면 카디널리티가 높다고 합니다. 예를 들어 성별 컬럼은 값이 제한되어 있기 때문에 카디널리티가 낮고, 주민등록번호의 경우는 카디널리티가 높습니다.
<br>

4. DB 인덱스에 해쉬 보다 B Tree를 쓰는 이유는 무엇인가요?

> B+트리를 사용하게 되면 banlanced 성질이 유지되어 데이터의 일관된 시간복잡도 내에 조회 가능. 해쉬는 해쉬 버킷의 일부 영역에만 데이터가 집중되는 경향이 있어 cache miss가 발생할 확률이 높음.
<br>

### :notebook_with_decorative_cover: 관계형 DB vs 비관계형 DB

1. 관계형 DB 와 비관계형 DB 의 차이점에 대해 설명해주세요.
- 관계형 DB는 1️⃣정해진 데이터 스키마에 따라 테이블에 저장되며 2️⃣관계를 통해 여러 테이블에 분산된다는 특징이 있다. 따라서 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다. 비관계형 DB는 그에 반해 스키마도 없고, 관계도 없다. 레코드가 아닌 문서(documents)라고 부르며, json과 비슷한 형태의 관련된 데이터들을 동일한 컬렉션에 저장한다.
2. RDBMS과 비교하였을 때 NoSQL의 장점을 설명해보세요.
Expand All @@ -23,6 +60,9 @@
- 데이터베이스를 수평으로 확장해야 하는 경우

### :notebook_with_decorative_cover: 트랜잭션 (Transaction)

<details>
<summary>정리</summary>
#### 트랜잭션이란?
------
데이터베이스 관리 시스템에서 하나의 논리적 작업 단위를 구성하는 일련의 연산들의 집합이다.
Expand Down Expand Up @@ -97,6 +137,50 @@ Transaction1이 Table B의 첫 번째 레코드의 lock을 얻고, Transaction2
- Serializable (Level 3): 트랜잭션이 완료될 때 까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸린다. 완벽한 Read 일관성 모드를 제공한다

<br>

</details>

<br>

1. 트랜잭션이 무엇인가요?

> 트랜잭션이란 하나의 논리적 수행 단위를 이루는 연산들의 집합을 의미합니다. 계좌 이체를 예를 들었을 때, 출금 계좌에서 돈을 꺼내는 작업과 입금 계좌로 돈을 넣는 작업 두 연산으로 이루어져 있습니다. 트랙잭션을 수행했을 때 내부의 모든 연산이 정상적으로 수행돼서 적용되거나, 실패했을 때는 수행하기 전 상태를 보장해야 합니다.
<br>

2. 트랜잭션의 ACID 성질에 대해 설명해주세요.

> 원자성, 일관성, 독립성, 지속성 네 가지의 성질로 이루어져 있습니다.
> 원자성이란 트랜잭션의 모든 연산들이 정상적으로 수행되어 반영되거나, 어떠한 연산도 수행되지 않은 상태를 보장해야 하는 것을 의미합니다.
> 일관성이란 트랜잭션의 수행 전 후에 데이터베이스의 무결성과 같은 상태가 유지되어야 하는 것 입니다.
> 독립성이란 트랜잭션은 다른 트랜잭션의 병렬적 수행에 영향 받지 않아야 하는 것을 말합니다.
> 지속성이란 트랜잭션이 성공적으로 완료되서 커밋되면, 이는 어떤 장애가 발생하더라도 보존되어야 한다는 것을 의미합니다.
<br>

3. 트랜잭션을 병행 처리할 때 문제점에 대해 설명해주세요.

> 두개의 트랜잭션이 병렬적으로 수행될 때, 하나의 트랜잭션에서 문제가 생겨 롤백을 해야된다면 다른 트랜잭션이 문제가 없음에도 같이 취소되어 버리는 현상이 발생할 수 있습니다.
4. 위의 질문의 해결 방법을 얘기해주세요.

> Locking을 통해 트랜잭션이 특정 레코드를 점유중일 때 다른 트랜잭션이 이에 접근하지 못하게 하는 방법이 있습니다.
> 락의 단위가 너무 크면 트랜잭션이 직렬적으로 수행되어서 실행 시간이 느려진다는 단점이 있고, 너무 작으면 독립성이 보장받지 못할 수 있습니다.
5. 공유락과 배타락에 대해 설명해주세요.

> 공유락은 읽기를 할 때 사용되는 락의 종류입니다. 트랜잭션이 데이터를 조회할 때 공유락을 걸게 되면, 다른 트랜잭션은 그 데이터를 읽을 수 있고 변경이나 삭제는 불가능합니다. 배타락은 수정/삭제를 할 때 거는 락의 종류입니다. 배타락을 걸게 되면 다른 트랜잭션은 그 데이터에 읽기/수정/삭제 연산을 할 수 없고, 어떠한 락도 걸 수 없습니다.
6. 트랜잭션 격리 수준의 레벨에 대해 얘기해주세요.

> 트랜잭션 격리 수준은 네 단계로 이루어집니다. SQL 서버에서 대표적으로 사용하는 Read-Commited 레벨에 대해서만 설명드리자면, 자신이 데이터를 읽는 동안 공유락을 걸어 다른 트랜잭션이 이를 수정할 수 없게끔 하는 레벨입니다.
6. 트랜잭션에 의해 발생하는 데드락을 설명해주세요.

> 두 개 이상의 트랜잭션이 각자가 가진 데이터에 대해 락을 걸고 요구하는 자원이 사이클을 띠고 있는 것을 말합니다.
<br>

<hr>

### :notebook_with_decorative_cover: 데이터 모델링
Expand All @@ -109,10 +193,24 @@ Transaction1이 Table B의 첫 번째 레코드의 lock을 얻고, Transaction2
3. 위에서 답변한 스키마 중에서 어떤 것이 더 낫습니까?

### :notebook_with_decorative_cover: 정규화 (Normalization)
1. 정규화란 무엇인지, 필요한 이유와 함께 답변해주세요.
- 한 릴레이션에 여러 엔티티의 어트리뷰트들을 혼합하게 되면 정보가 중복 저장되며, 저장 공간을 낭비할 수 있다. 또한 중복된 정보로 인해 갱신 이상이 발생하게 된다. 따라서 관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업을 정규화라고 한다.
2. 각 정규화 단계에 대해 **만족되어야 할 조건**을 중심으로 설명해주세요.
- 제1정규형: 어트리뷰트의 도메인이 오직 원자값 만을 포함하고, 튜플의 모든 어트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다.
- 제2정규형: 모든 비주요 어트리뷰트들이 키 어트리뷰트에 대해 완전 함수적 종속이다.
- 제3정규형: 어떠한 비주요 어트리뷰트도 기본키에 대해 이행적으로 종속되지 않는다
- BCNF정규형: 여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용.

1. 함수적 종속 관계에 대해 설명해주세요.

> (테이블의 모든 컬럼에 대해 X가 Y를 결정할 수 있으면 Y가 X에 함수적으로 종속되었다고 말합니다.)
> 부분 함수적 종속은 종속자가 결정자의 전체가 아닌 일부분에도 함수적 종속이 되는 것입니다. 완전 함수적 종속은 그에 반해 전체에 대해서만 함수적 종속이 되는 것입니다.
2. 이상 현상에 대해 설명해주세요.

> 테이블이 잘못 설계되면 삽입 이상, 수정 이상, 삭제 이상 현상이 나타납니다. 이를 방지하기 위해 테이블을 적절하게 정규화 하는 것이 필요합니다.
> 삽입 이상이란 새 데이터를 삽입하기 위해 불필요한 필드까지 함께 삽입해야 하는 현상입니다.
> 수정 이상이란 중복된 데이터 중 일부만 변경해서 데이터의 불일치가 발생하는 현상입니다.
> 삭제 이상이란 레코드를 삭제하기 위해 필요한 데이터들도 함께 삭제되어버리는 현상입니다.
3. 정규화란 무엇인지, 필요한 이유와 함께 답변해주세요.

> 릴레이션이 저장 공간을 낭비하고 이상 현상이 발생하는 것을 막기 위해 테이블을 분리해서 데이터를 구조화하는 작업을 정규화라고 합니다.
4. 각 정규화 단계에 대해 **만족되어야 할 조건**을 중심으로 설명해주세요.

> 제1정규형은 모든 어트리뷰트의 레코드가 하나의 값만을 가지는 것입니다.
> 제2정규형은 기본키가 아닌 어트리뷰트들이 기본키 컬럼에 대해 완전 함수적 종속인 것을 말합니다.
2 changes: 1 addition & 1 deletion java/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
6. 클래스는 무엇이고, 객체는 무엇인지 설명해주세요.
7. 인터페이스와 추상클래스의 차이점은 무엇인지 설명해주세요.
8. 직렬화가 무엇인지 설명하세요.
9. Call by Value와 Call by Reference의 차이에 대해 설명해주세요.
9. Call by Value와 Call by Reference의 차이에 대해 설명해주세요.
10. Checked Exception과 Unchecked Exception의 차이를 설명해주세요.
11. JVM의 역할에 대해 설명해주세요.
12. JDBC란 무엇인가요?
Expand Down
Loading

0 comments on commit 6e9daa9

Please sign in to comment.