본문 바로가기
CS

[CS] SHA-256 + Salt

by doodoom 2023. 7. 13.

0. 이 글을 쓰게 된 이유

프로젝트를 진행하며 SHA-256 단방향 암호화를 진행하면서 발생하는 문제점을 인식하고 해결한 과정에 대해 기록하고자 이 글을 쓰게되었다.

1. SHA-256이란?

SHA-256은 SHA-2(Secure Hash Algorithm 2)의 한 형태로, 암호학적 해시 함수의 집합 중 하나이다. 여기서 256은 이 알고리즘이 생성하는 해시 값의 비트 길이이다.

암호학적 해시 함수란 임의의 크기를 입력 받아 그 길이의 고유한 문자열로 변환하는 함수이다. 암호학적 해시 함수는 다음과 같은 특징을 가지고 있다.

  1. Preimage resistance (원상 저항성): 해시 결과(해시 값)로부터 원래의 입력 값을 찾아내는 것이 불가능하다. 즉, 해시 값만 가지고는 원래 데이터를 알아낼 수 없다.

  2. Second preimage resistance (제2원상 저항성): 주어진 입력 값에 대해 동일한 해시 값을 생성하는 다른 입력 값을 찾아내는 것이 어렵다.

  3. Collision resistance (충돌 저항성): 두 개의 임의의 다른 입력 값이 동일한 해시 값을 생성하는 것, 즉 충돌이 발생하는 것이 어렵다.

위의 특징 때문에 고유하고 안전해서 단방향 암호화에서 많이 사용된다. 하지만 SHA-256도 뚫릴 수 있는 가능성이 있다.

2. SHA-256의 약점

해시 함수는 어쩔 수 없이 동일한 입력에 대해 항상 동일한 출력을 생성한다. 즉, 누가 암호화하던 동일한 입력이라면 동일한 출력이라는 것이다.
이러한 약점을 활용해서 해커들은 SHA-256를 통해 생성된 해시 값을 따로 저장해두고, 일치하는 값을 확인한다. 이를 레인보우 테이블이라고 한다.

2.1 레인보우 테이블(Rainbow Table)

레인보우 테이블은 암호학적 해시 함수를 통해 생성된 해시 값을 역으로 추척해서 원래의 데이터(일반적으로 패스워드)를 찾아내기 위한 방법 중 하나이다.
레인보우 테이블은 미리 계산된 해시 값과 그에 해당하는 원래의 데이터를 대응시킨 테이블을 의미한다. 이 테이블은 많은 양의 디스크 공간을 차지하지만, 빠르게 해시 값을 '크래킹'할 수 있게 해준다. 사람이 하나하나 확인하는 것은 어렵지만 이를 컴퓨터로 진행한다면 금방 찾을 것이다. 그렇다면 이에 대한 대응책은 뭘까?

3. 대응책 - Salting

솔팅(Salting)은 암호화된 정보, 특히 사용자의 비밀번호에 추가적인 무작위 데이터를 더하는 방식을 말한다. 이 추가적인 데이터는 '솔트(Salt)'라고 부르며, 해시 함수에 들어가는 입력값을 변경해 해시 결과를 달리하는 역할을 한다.
이렇게 되면 레인보우 테이블에 대한 공격을 거의 대부분 방어할 수 있다.

하지만 솔팅의 단점은 사용자에 대한 솔트를 서버가 가지고있어야한다. 즉, 서버는 암호화된 비밀번호와 솔트 모두 가져야한다. 그만큼 비용이 크다는 것이다.

솔팅은 패스워드의 보안성을 향상시키는 매우 좋은 방법이다. 하지만 당연하게도 솔팅만으로는 충분하지 않으며, 다른 보안 조치와 함께 사용한다. 예를 들어, 강력한 해시 알고리즘을 사용하거나, 해시를 여러 번 적용하는 등의 방법 등이 있다.