Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
Tags
- 펍 워크스페이스
- IP
- Bitbucket Slack 연동
- pub workspace go_router
- 고 라우터
- ci/cd
- Flutter Network Interceptor
- flutter interceptor
- Swift
- 멀티모듈 고 라우터
- Di
- 알고리즘
- 단편화
- 플러터
- Jira Slack 연동
- Algorithm
- Match
- 난수
- 인터셉터 구현
- Flutter Logging
- 플러터 인터셉터
- 멀티패키지
- 네트워크
- Flutter Netwrok Logging
- 스위프트
- go_router
- ios
- Flutter
- 패킷
- Python
Archives
- Today
- Total
INEEDACHACHA
키 관리(Key Management) 본문
키 생성
- 난수를 이용한 키 생성
- 패스워드를 이용한 키 생성
난수를 이용한 키 생성
- 난수 사용
- 이유 → 키 성질로 ‘다른 사람이 추측하기 어려워야 한다’를 가져야 하기 때문
- 난수는 추측하기 어렵기 때문에 키로 적합
- 난수
- RNG → H/W 컴퓨터의 노이즈를 암호로 난수 생성
- PRNG → S/W , rand()
- 무작위성
- 예측 불가능성
- 재현 불가능성
- 주기가 없어야 한다는 말
- 소프트웨어적으로는, 언젠가는 재현이 된다.
- 난수 생성
- 하드웨어를 사용하는 것이 좋지만
- 통상적으로 암호용으로 설계된 의사난수 생성기 소프트웨어를 사용
의사난수 만들기
- 암호용으로 이용하는 의사난수 생성기로 생성: ‘예측 불가능’ 성질을 갖음
패스워드
- 패스워드 혹은 패스 프레이즈로부터 키를 생성
- Passphrase: 복수의 단어로 이루어지는 긴 패스워드
- password를 키로 직접 이용하지 않고, password를 일방향 해시 함수에 입력해서 얻어진 해시 값으 키로 이용
PBE와 솔트(salt)
- password based encryption; PBE
- password에 salt라 불리는 난수를 부가해서
일방향 해시 함수에 입력하고 그 출력을 키로 사용 - 사전 공격(dictionary attack0을 막기 위한 조치
- e.g. Alice가 좋아하는 단어들을 미리 HashTable을 만들어서 대입해서 공격
- Salt 값을 넣어서 경우의 수를 늘린다.
- password에 salt라 불리는 난수를 부가해서
키 배송
- 키 배송 문제
- 키를 사전에 공유하는 방법
- 키 배포 센터를 이용하는 방법
- Diffle-Hellman 키 교환 <주로 사용>
- 공개 키 암호를 사용하는 방법 <주로 사용>
키 갱신
- 키 갱신(key updating)
- 공통 키를 사용하여 통신을 하고 있는 중에 정기적으로 키를 교환
- 송신자와 수신자가 동시에 같은 방법으로 키 교환
- 현재 키의 해시 값을 다음 키로 사용
- 키 갱신의 장점
- 백워드 시큐리티(backward security): 키 노출 시 과거 통신의 복호화를 방어
키 보존
- 키를 반복해서 사용할 경우 키 보존 문제
- 키를 암호화해서 보존하는 기술을 사용
- KEK(Key Encryption Key)
- 키를 암호화하는 키
- 다수의 키를 한 개의 키(KEK)로 암호화하여 보관
키 폐기
- 불필요해 진 키는 확실히 삭제
Diffie-Hellman 키 교환 (매우 중요)
1976년에 Whitfield Diffie와 Martin Hellman이 발명한 알고리즘
타인에게 알려져도 상관 없는 정보를 두 사람이 교환하는 것 만으로 공통의 비밀 값을 만들어내는 방법
IPsec에서는 Diffuse-Hellman 키 교환을 개량한 방법(Oakley 키 결정 프로토콜)을 사용
반키를 사용하는 알고리즘

원시근의 의미

- e.g. 숫자 3을 가지고 시계가 7칸짜리라고 가정
- 3¹ = 3
- 3² = 3×3 = 9 → 시계는 7칸이니까 9는 2
- 3³ = 3×3×3 = 27 → 27은 6 (27에서 7을 몇 번 빼면 6 남음)
- 3⁴ = 81 → 시계 7칸으로 보면 81은 4
- 3⁵ = 243 → 243은 5
- 3⁶ = 729 → 729는 1
- 이렇게 하면 3을 여러 번 곱해서 1, 2, 3, 4, 5, 6 같은 모든 숫자가 다 나온다
- 이럴 때 3을 원시근이라고 한다
Password Based Encryption; PBE
- 패스워드를 기초로 해서 만든 키로 암호화를 수행하는 방법
- RSA사의 PKCS #5 규격으로 규정되어 있는 PBE Java의 java.crypto 패키지 등에 내장
- 암호 소프트웨어 PGP에서 키를 보존
PBE 암호화 절차
- 중요한 메시지의 기밀성을 유지하고 싶다.
- 메시지를 그대로 디스크에 보존하면 누군가에게 읽혀질 수 있다.
- 키(CEK)를 사용해서 메시지를 암호화
- 키 CEK의 기밀성 유지해야 한다
- 키 CEK를 그대로 디스크에 보존하는 것은 위험하다
- KEK를 사용해서 CEK를 암호화 하자
- KEK의 기밀성을 유지해야 한다. (빙빙 도는 것에 지나지 않는다)
- 키(KEK)는 패스워드로 부터 만든다
- 패스워드로만 만들면 사전 공격 받을 위험 존재
- KEK는 솔트와 패스워드로 부터 만든다
- 솔트는 암호화한 키 CEK와 함께 보존해두고 KEK는 버리고 자신의 머릿속에 보존해 두기로 한다.

솔트(Salt)의 역할
- 의사난수 생성기로 만들어지는 랜덤한 수(Salt)로 키(KEK)를 만들 때에 패스워드와 함께 일방향 해시 함수에 입력
- 사전 공격을 막기 위해 필요
- e.g. 2^160 Salt를 넣으면 Table 자체를 만들기가 어렵다
패스워드 솔팅 기반의 인증

- 패스워드 사전 공격을 어렵게 함 → 미리 만들어진 사전에 있는 모든 패스워드 후보 단어들을 사용하는 공격
- 솔트의 길이가 충분히 길 때 무지개표의 크기가 훨씬 늘어나 사전 공격이 어려워짐(해시 계산 비용 증가)