Missing Semester - (9)

황수정·2021년 1월 15일

Missing Semester

목록 보기
7/7

Security and Cryptography[보안과 암호학]

#시스템보안

엔트로피(Entropy)

: 가능성에 대한 것을 단위로 표현한 것
안전한 비밀번호?

“correcthorsebatterystaple”라는 패스워드는 “Tr0ub4dor&3”라는 패스워드보다 안전하다.

엔트로피는 bits 단위로 측정되며, 가능한 결과 집합에서 무작위로 균일하게 선택 할 때, 엔트로피는 log_2(# of possibilities:선택가능한 문자의 수)와 동일합니다. 동전 던지기는 1 bit의 엔트로피를 제공합니다. 6면을 가진 주사위 굴리기는 ~2.58 bits의 엔트로피를 가집니다.
몇 bits의 엔트로피가 충분할까요? 이는 당신의 위협 모델에 달렸습니다. 온라인 추측의 경우 위의 XKCD 만화에서 확인했듯이, ~40 bits의 엔트로피로 충분합니다. 오프라인 추측에 대응 할 경우 더 강력한 암호가 필요합니다.

랜덤한 숫자를 고르려면 사람이 고르기보다는 주사위에 맡기는 게 낫다.


Hash(해시) 함수

Hash(해시)?

[참고]https://siyoon210.tistory.com/85
key(index)와 value를 한 쌍으로 묶어 저장하는 데이터 기법이다. key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균적인 시간 복잡도가 O(1)에 수렴한다. 해시 함수에 의해 얻어지는 값(hash value)을 의미하기도 한다.

해시 함수?

[참고] https://steemit.com/kr/@yahweh87/2
임의의 길이를 갖는 메시지를 입력받아 고정된 길이의 해시값출력하는 함수. 암호 알고리즘에는 키가 사용되지만, 해시 함수는 키를 사용하지않으므로 같은 입력에 대해서는 항상 같은 출력이 나오게 된다.

사용 목적?

  • 경제적인 데이터 관리 : 적은 리소스로 많은 데이터를 관리
  • 빠른 데이터 검색&삽입&삭제 : 시간복잡도 낮음

특징

  • 결정적(Deterministic) : 같은 입력 값은 항상 같은 결과가 도출
    복구 불가능(Non-invertible) : 원하는 출력값 h에 대하여 hash(m) = h를 만족하는 m을 찾기 어려움

  • 약한 충돌 저항성(Target collision resistant) : m_1이 주어졌을 때, hash(m_1) = hash(m_2)를 만족하는 m_2를 찾기 어려움
    => 서로 다른 input값이 들어가면 같은 output이 나올 가능성이 매우 낮다.

  • 강한 충돌 저항성(Collision resistant) : hash(m_1) = hash(m_2)를 만족하는 m_1과 m_2를 찾기 어려움(약한 충돌 저항성보다 강한 속성)
    => 결과 값이 들어갔는데 서로 같은 값이 나오는 두 input을 찾기 어려움

메시지의 오류나 변조를 탐지할 수 있는 무결성을 제공하기 위해 사용된다. 비밀번호 저장, 복제된 문서인지 판별(문서내용을 해시값으로 변환해 비교할 양을 줄임), 검색 용도로 활용하기도 한다.

SHA-1

[sha1 해시 생성기]https://www.convertstring.com/ko/Hash/SHA1
git에서 사용
모든 내용을 40개의문자열 => 한 글자당 4bit => 160bit로 저장
: SHA(Secure Hash Algorithm, 안전한 해시 알고리즘)
sha알고리즘의 종류와 특징

ubuntu 실습

어플리케이션 Applications

왜 git에서 사용할까?
private 코드를 보호하기 위해?
commit에 대한 index
동전없이 동전던지기 => 어떻게하면 가장 공정하게 결과값을 비교할것인가?
암호화된 head를 서로 비교하면 내용을 공개하지 않고도 서로 같은지 다른지를 비교할 수 있다.

http/=>ssl handshake와 유사?
http://blog.naver.com/PostView.nhn?blogId=sehyunfa&logNo=221812730631&categoryNo=19&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=postView

Git, 컨텐츠 주소 지정 스토리지용. hash 함수의 개념은 더 일반적입니다.(암호화의 목적이 아닌 Hash 함수가 있음). 왜 Git이 암호화 Hash 함수를 사용할까요?
파일 내용을 짧게 요약. 사용자들은 소프트웨어를 (덜 신뢰할 수 있는) 미러 사이트에서 다운받곤 하는데(예 - Linux ISO), 이는 신뢰하지 않는 것이 좋습니다. 공식 사이트에서는 보통 타사의 미러 페이지로 이동하는 다운로드 링크와 함께 파일의 Hash 값을 게시 합니다. 이를 통해 사용자는 파일을 다운로드 받은 후 다운로드 받은 파일의 Hash를 확인할 수 있습니다.
Commitment schemes. 특정 값을 커밋하고 싶지만, 나중에 공개하고 싶다고 가정합니다. 예를 들어, 나는 두 당사자가 볼 수 있고 신뢰할 수 있는 공유 동전 없이 “내 머리속에” 공정한 동전 던지기를 하고 싶습니다. 나는 r = random()인 값을 선택한 다음 h = sha256(r)을 공유할 수 있습니다. 그 후, 앞면 혹은 뒷면을 외칠 수 있습니다(r이 짝수 일 경우는 앞면이며, 홀수일 경우에는 뒷면을 의미한다고 약속합니다.). 당신이 외친 후, 내 값인 r을 공개할 수 있고, sha256(r)이 이전에 공유 한 Hash와 일치하는지 확인하여 내가 속이지 않았음을 확인할 수 있습니다.

키 유도 함수(Key derivation functions)

암호화 Hash와 관련된 개념인 key derivation functions (KDFs)는 다른 암호 알고리즘에서 키로 사용하기 위한 고정 길이 출력값을 생성하는 것도 포함하여, 여러 응용 프로그램에서 사용됩니다. 일반적으로, KDF는 오프라인 무차별 대입 공격의 속도를 늦추기 위해 의도적으로 느립니다.
예를 들어 한번 시도할때마다 5초의 텀을 준다면, 일반 유저의경우라면 몇번의 시도만으로 풀 수 있지만 몇천번 이상을 시도해야하는 해커는 BruteForce로 비밀번호를 풀기 어려움

어플리케이션 Applications

  • 다른 암호화 알고리즘에서 사용하기 위한 암호구문 키 생성 (예 - 대칭키 암호, 아래 참조)
  • 로그인 자격증명 저장. 패스워드 평문 저장은 적절하지 않습니다. 올바른 접근 법은 각 사용자 별로 salt = random()인 랜덤한 salt를 생성하고, KDF(password + salt)를 저장합니다. 그 후 입력 된 패스워드와 저장된 salt로 제공된 KDF를 다시 계산하는 방법으로 로그인 시도를 검증합니다.

대칭키 암호(Symmetric cryptography)

독자가 암호학에 대해 생각했을 때 가장 먼저 떠오르는 개념

어플리케이션 Applications

비대칭 암호화(Asymmetric cryptography)

ssh에 적용
공개키를 이용해 일단 암호를 줌
개인키(ex) .pem)를 따로 부여해 이 키파일을 통해서 복호화를 함

암호화폐, 공인인증서도 같은 개념.

어플리케이션 Applications

  • PGP email 암호화. 사람들은 자신의 공개키를 온라인상에 올릴 수 있습니다. (예 - PGP Keyserver나 Keybase 등). 그러면 누구나 그 사람에게 암호화된 메일을 보낼 수 있습니다.

  • 개인 메시지. Signal나 Keybase와 같은 어플리케이션은 개인 통신 채널을 설정하기 위해 비대칭 키를 사용합니다.

  • Signing software. Git에 GPG-signed commits과 tags를 사용할 수 있습니다. 공개된 공용 키를 사용하면, 누구나 다운로드된 소프트웨어의 신뢰성을 확인할 수 있습니다.

키 분배(Key distribution)

비대칭 키 암호화는 훌륭하지만, 공용 키를 배포하고 실제 ID에 공개키를 매핑하는 데는 큰 어려움이 있습니다. (올린 공용 키가 실제 id에 맞는 키인지 확인하기 어려움) 이 문제에 대한 많은 해결책이 있습니다. Signal에는 첫 번째 사용에 대한 신뢰와 대역 외 공개 키 교환 지원 (직접 친구의 “안전 번호”확인)이라는 간단한 솔루션이 있습니다. PGP에는 web of trust라는 다른 솔루션이 있습니다.

Keybase(서비스)에는 사회적 증명 (다른 깔끔한 아이디어와 함께)의 또 다른 솔루션이 있습니다. 각 모델에는 장점이 있습니다. 우리 (강사)는 Keybase의 모델을 좋아합니다.

Case studies

Password managers

어떻게 활용할것인가
google 다른 기기에서 첫접속 시 증명
(keybase)

Two-factor authentication

Two-factor authentication(2FA)에서는 도난된 암호와 phishing(private data fishing 합성어. fishing 아님. 보이스피싱 이거) 공격으로부터 보호하기위해 2FA 인증자(YubiKey, “보유한 것”등)와 함께 암호(“알고있는 것”)를 사용해야 합니다.

전체 디스크 암호화

랜섬웨어같이 노트북 디스크 전체를 암호화하는 것

개인 메시지

Signal 또는 Keybase를 사용합니다. End-to-end의 보안은 비대칭 키 암호화에서 부트스트랩(self-managing의 의미) 됩니다. 연락할 사람의 공용 키를 얻는 것이 중요한 단계입니다. 안전한 보안을 원한다면, out-of-band(Signal 또는 keybase를 사용하여)로 공개 키를 인증하거나, 사회적 증명(keybase 사용)을 신뢰해야 합니다.

SSH

: 공용키 + .pem

전 강의에서 SSH와 SSH키 사용에 대해 다루었습니다. earlier lecture 이것의 암호적 측면을 살펴봅시다.

ssh-keygen 실행 시, public_key, private_key의 비대칭 키쌍이 생성됩니다. 이는 운영체제에서 제공되는 엔트로피를 사용하여 무작위로 생성됩니다(하드웨어 이벤트 등에서 수집). 공용 키는 그대로 저장되며(공개키 이므로 비밀 유지하는 것은 중요하지 않음), 개인키는 디스크에 암호화되어 저장되어야 합니다. ssh-keygen 프로그램은 사용자에게 암호를 묻고, 이는 키 유도 함수를 통해 제공되어 키를 생성 한 다음 대칭 암호로 개인 키를 암호화하는 데 사용됩니다.

사용 시, 서버가 클라이언트의 공용 키(.ssh/authorized_keys에 저장된 파일)를 알게 되면, 연결 클라이언트는 비대칭 서명을 사용해 신원을 증명할 수 있습니다. 이것은 challenge-response을 통해 이루어집니다. 상위 수준에서, 서버는 임의의 숫자를 선택하여 클라이언트에게 전송합니다. 그 후 고객이 이 메시지에 서명하고 서명을 서버로 다시 보내면, 서버는 서명을 기록 된 공개키와 비교합니다. 이는 클라이언트가 서버의 .ssh/authorized_keys파일의 공개키에 해당하는 개인키를 소유하고 있음을 효과적으로 입증하며, 서버는 해당 클라이언트의 로그인을 허용할 수 있습니다.

  • RSA 방식
    암호학: 모듈연산
    실제로는 대칭, 비대칭키 암호를 +카이사르 (시저) 암호를 복합적으로 사용한다.

예제

이진수 bit연산이므로 밑은 2

  1. log 2 (10)^25 => 25 log2 (10) => 75
  2. log 2 (62)^8 => 8 log2 (62) => 40
  3. 1번이 더 높음

Debian : 리눅스의 ubuntu같은 것. 오래된 root
책추천: <해커, 광기의 랩소디>

profile
알고리즘 , 웹 공부 중인 개발자 지망생

0개의 댓글