1. 해시함수
: 임의의 길이를 갖는 데이터를 고정된 길이의 데이터로 변환시켜주는 함수, 블록체인에서는 ‘암호화’를 한다.
*SHA-256
- 단 방향 변환 알고리즘이다.(즉, 다이제스트(해시값)를 가지고 입력값을 유추할 수 없다.)
그이유? 입력값이 조금만 바뀌어도 값이 완전히 바뀌는 임의성을 가지고 있기 때문이다. => 이러한 것을 '눈사태효과'라고 한다.
- 결과값이 정해진 길이로 나온다.(아무리 길이가 달라도 똑같은 길이의 다이제스트를 가진다.)
=> 원본 데이터로를 다이제스트를 구할 수 있지만 다이제스트로 원본 데이터를 찾을 수 없다(단방향)
2.해시함수의 단점
1) 인식 가능성
:동일한 입력값이 동일한 다이제스트를 갖는다면 공격자가 다이제스트들을 가능한 많이 확보한 다음, 탈취한 다이제스트와 비교해 원본 입력값을 찾아낼 수 있다.
여기서 다이제스트 목록을 '레인보우테이블'이라고 하며, 이와 같은 공격방식을 '레인보우 공격'이라고 한다.
또 만약 다른 사용자와 비밀번호가 같다면 공격자는 여러명의 정보를 탈취할 수 있다는 뜻을 의미한다.
여기서 다이제스트 목록을 '레인보우테이블'이라고 하며, 이와 같은 공격방식을 '레인보우 공격'이라고 한다.
또 만약 다른 사용자와 비밀번호가 같다면 공격자는 여러명의 정보를 탈취할 수 있다는 뜻을 의미한다.
2.속도
: 해시 함수의 빠른처리속도로 인해 입력값의 변경등을 빨리 알아챌 수 있지만 반대로 공격자의 입장에서도 빠르게 다이제스트들을 비교할 수 있다라는 뜻이다. ( 요즘은 일반적으로 1초에 50억개를 비교할 수 있다고한다.)
해시함수의 빠른 처리가 공격자에게는 오히려 편의로 쓰일 수 있다.
해시함수의 빠른 처리가 공격자에게는 오히려 편의로 쓰일 수 있다.
3.보완
1.salting
:원본 메시지에 바이트단위의 문자열을 추가하여 다이제스트를 생성하는 것을 말한다.
공격자가 기존 메시지의 다이제스트를 알았다해도 솔팅된 다이제스트를 확인하는 것은 어렵기 떄문이다.
그리고 사용자별로 동일한 패스워드를 사용한다해도 그때마다 솔팅된 다이제스트가 다르기 떄문에 인식가능성에서 제기된 문제가 해결된다.
=> 즉, 사용자마다 패스워드에 고유의 솔트를 가지고 있기때문에 이것을 DB에 저장하여, 사용자가 로그인할때마다 입력한 패스워드를 가지고 일치여부를 확인할 수 있다.
2.key stretching
: 입력한 패스워드와 다이제스트를 생성하고, 생성된 다이제스트를 입력값으로 하여 다이제스트를 생성하고 또 이 방법을 반복하여 다이제스트를 생성할 수 있다.
이 방법을 사용할 경우 입력한 패스워드를 동일한 횟수만큼 해시해야지만 입력한 패스워드의 일치여부를 알 수 있다. 즉, 시간이 걸린다.
최근에 1초에 50억개의 다이제스트를 비교할 수 있었지만, 키 스트레칭을 사용하면 1초에 5번정도로 엄청 횟수를 줄일 수 있다.
이런 방법을 통해서 보완을 추가할 수 있다.
참고 글
https://d2.naver.com/helloworld/318732
'CS지식💪' 카테고리의 다른 글
프레임 워크 vs 라이브러리 (0) | 2023.03.29 |
---|---|
Parameter & Argument (0) | 2023.03.28 |
Hoisting & TDZ (0) | 2023.03.28 |
렌더링 과정 (0) | 2023.03.27 |
REST API란? (0) | 2023.03.27 |