레이블이 암호인 게시물을 표시합니다. 모든 게시물 표시
레이블이 암호인 게시물을 표시합니다. 모든 게시물 표시

2022년 6월 30일 목요일

[암호] 해시 함수(hash function), 일방향 함수(one-way function)

보안을 하다보면 많이 접하게 되는 해시 함수(hash function) 또는 해시 알고리즘(hash algorithm)에 대하여 알아보자


해시 함수는 임의의 길이의 데이터를 임의의 고정된 길이의 데이터로 매핑하는 함수이다.


예를 들어 큰 수를 10으로 나눈 나머지를 구하는 함수도 해시 함수라고 할 수 있다.

10001 % 10 = 1

1000000002 % 10 = 2

5 % 10 = 5

1500 % 10 = 0

임의의 큰 수를 입력해도 결과는 항상 1자리수로 나오기 때문이다.

여기서 10으로 나눈 수(해시 함수의 결과)를 해시 값, 해시 코드 등으로 불린다.


조금 더 자세히 설명하기위해 일방향 함수(one-way function)을 먼저 설명하겠다.

일방향 함수 즉 한쪽으로는 쉽고 반때쪽으로 어려운 함수이다.


위에서 예로든 % 가 좋은 예가 된다. 

x % 10 = y        

x를 알떄 y를 구하는건 쉽다. x = 11 이면 y=1, x = 105 이면 y = 5

y를 알때 x를 구하는건 쉬지 않다. y = 1 이면 x = 1, 11, 111, 1111, 11111 등등 중 하나.

반면 + 1 의 경우는 일방향 함수가 아니다.

x + 1 = y

x를 알때 y를 구하는건 쉽다. x = 1 이면 y = 2

y를 알때 x를 구하는것 또한 쉽다. y = 1 이면 x = 0


해시함수는 이러한 일방향 함수에서 몇가지 특성이 추가된다

위에서 예로든 % 의 경우 x가 1, 11, 111, 1111 모두 % 10 을 하면 1 이 된다. 

이를 충돌(collision)이라 한다.

해시함수는 입력이 다르지만 해시 값이 같을 수 있다. 해시 함수는 큰 데이터를 작게 만드는 것이기 때문에 충돌은 피할 수 없다. 

다만 이 충돌을 찾기 힘들어야 한다.

%는 충돌을 찾기 쉽기 때문에 좋은 해시 함수는 아니다.


해시함수는 입렵값이 바뀌면 결과값도 크게 바뀌어야 한다.

1비트라도 달라진다면 해시값이 달라져야 하며 같은 값이 될 수도 있지만 불가능한 수준이여야 한다. 해시 입력1과 해시 입력2가 비슷하더라도 해시 결과1 해시 결과2는 많이 달라야 한다.


요약하자면

1. 일방향 함수

2. 충돌을 찾기 어려움

3. 입력이 바뀌면 결과가 크게 바뀜


이러한 특징이 왜 중요한지 잘 이해가 되지 않을수 있다.

하지만 어떻게 사용되고 있는지 본다면 더 잘 이해가 될 것이다.

로그인 비밀번호를 db에 저장할 경우 그냥 저장한다면 db 관리자는 사용자의 비밀번호를 그냥 확인 할 수 있다. 하지만 해시 함수를 이용하여 해시 값을 저장한다면 db 관리자는 해시 값은 알수 있지만 비밀번호는 알 수 없다. (one-way function + 충돌을 찾기 어려움)

데이터와 데이터의 해시 값을 수신 받았을 경우 누군가 데이터를 변조 하였을 때 해시 값을 비교 하여 데이터가 바뀐 사실을 알수있다.( 입력이 바뀌면 결과도 바뀐다. 물론 해시 값도 바꾸면 어쩔 수 없지만 그에 대한 장치는 다른 방법으로 보완한다)

비밀번호를 해시 하여 저장할때 비밀번호1과 비밀번호2가 비슷하더라도 해시 값1과 해시 값2는 많이 다르기 때문에 db 관리자는 비밀번호1과 비밀번호2가 비슷하다고 유추할 수 없다.


암호화(encrypt)와 차이도 잘 알아두었으면 좋겠다.

암호화는 기본적으로 인증된 사람만 볼수 있게 하는것이 목적이다.

그래서 인증된 사람만 암호문을 만들수 있고 인증된 사람만 복호화 할 수 있다.

반면 해시는 누구나 해시 할수 있고 누구도 해시 결과로 해시 전의 데이터를 알수 없다.


암호학적으로 유명한 해시 함수는 MD5, SHA계열의 해시 함수가 있다.

2020년 8월 11일 화요일

[암호] MAC(Message Authentication Code), HMAC, CMAC

보안에서 MAC( Message Authentication Code )은 메시지의 위변조를 확인하기 위해 쓰이는 작은 정보이다. 
비밀키를 이용하기 때문에 인증 역활도 수행가능하다.

MAC은 크게 HMAC과 CMAC이 존재 하는데 
MAC을 만들때 Hash 함수를 사용하면 HMAC( Hash-based Message Authentication Code )
Block 함수를 사용하면 CMAC( Cipher-based Message Authentication Code )가 된다.


HMAC은 Hash함수를 뭘로 쓰느냐에 따라 HMAC-MD5, HMAC-SHA1, HMAC-SHA256, HMAC-SHA512등등 여러 버전이 존재한다.

Hash함수를 간단히 하게 설명하자면 임의의 크기를 가진 데이터를 고정된 작은 데이터 크기로 변환시키는 알고리즘이다.
전체 메시지에서 작은 부분이라도 바뀌게되면 결과 값이 달라지기 때문에 데이터의 위변조를 쉽게 확인할 수 있다.
Message Digest라고도 한다.

HMAC의 주된 기능은 사용자 인증(authentication)과 데이터 무결성(data integerity) 보장이며 자세한 스펙은 RFC 2104(https://tools.ietf.org/html/rfc2104)에 정의 되어 있다.


 
CMAC은 알고리즘과 운영(mode)에 따라서 AES CBC-MAC, ARIA CBC-MAC 등이 존재한다

CMAC도 마찬가지로 주된 기능은 사용자 인증(authentication)과 데이터 무결성(data integerity)이다. 
자세한 스펙은 RFC 4493(https://tools.ietf.org/html/rfc4493)에 정의 되어 있다.




2020년 1월 2일 목요일

[암호] 보안의 3요소 CIA( Confidentiality, Integrity, Availability )

보안에서 3요소라 하면 Confidentiality(기밀성), Integrity(무결성), Availability(가용성)를 줄여 CIA라 한다.

Confidentiality(기밀성)
데이터의 기밀을 유지. 즉 허가된 사용자만 볼수 있는것을 의미한다.
예를 들면 전쟁에서 우리가 공격할 위치와 시간을 아무나 알수 있으면 안된다는 것이다.
기밀성 유지를 위해 접근통제라던지 암호화를 많이 사용한다.

Integrity(무결성)
데이터의 무결함을 뜻한다. 데이터가 변조되지 않았음을 의미한다.
변조를 막거나 또는 변조되더라도 변조 여부를 알수 있어야 한다.
예를 들면 인터넷뱅킹을 이용하는데 '10만원 이체'를 중간에 누군가 '100만원 이체'로 바꿨을 때 은행에서는 '100만원 이체'가 변조되었다는 것을 알수 있어야 한다.
무결성 보장을 위해 hash(해쉬)함수를 많이 사용한다.

Availability(가용성)
서비스가 제대로 작동되어야 하며 사용하기 쉬워야 한다.
Availability가 "왜 보안요소에 포함되냐"라고 생각할 수 있겠지만 위협요소를 보면 쉽게 납득된다.
대표적인 위협요소로 DoS(Denial-of-service Attack), DDoS(Distributed Dos)가 있다.
Dos는 정보를 캐오거나 사용자를 속이는 공격이 아니다. 단지 사용자가 서비스를 이용하지 못하게 방해할 뿐이다. 하지만 이로인해 정보를 사용할 수 없고 사용할 수 없으니 필요없게 만들어 버린다.

보안을 공부할때 처음 배우는 개념이고 위 3요소를 충족하기 위한 방법을 공부하게된다.