맨위로가기

솔트 (암호학)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

솔트는 암호학에서 비밀번호와 함께 사용되어 보안을 강화하는 데 사용되는 무작위 문자열이다. 솔트는 비밀번호 해시 값을 생성할 때 사용되어, 동일한 비밀번호를 사용하더라도 서로 다른 해시 값을 생성하여 레인보우 테이블 공격 및 사전 공격을 방어한다. 솔트는 일반적으로 암호학적으로 안전한 의사 난수 생성기를 통해 생성되며, 비밀번호와 함께 안전하게 저장된다. 솔트의 길이는 다양할 수 있으며, 짧은 솔트 사용, 솔트 재사용 등 잘못된 솔트 사용은 보안 취약점을 발생시킬 수 있다. 유닉스 시스템과 웹 애플리케이션에서 솔트가 구현되는 방식이 다르며, 개인정보 보호 및 시스템 보안 유지를 위해 솔트 사용의 중요성이 강조된다.

더 읽어볼만한 페이지

  • 암호학 - 양자 컴퓨터
    양자 컴퓨터는 양자역학적 현상을 이용하여 정보를 처리하는 컴퓨터로, 큐비트를 통해 0과 1을 동시에 표현하여 특정 연산에서 기존 컴퓨터보다 빠른 속도를 보이며 암호 해독, 신약 개발 등 다양한 분야에 혁신을 가져올 것으로 기대된다.
  • 암호학 - 암호화
    암호화는 정보를 보호하기 위해 사용되는 기술로서, 단순한 문자 치환 방식에서 시작하여 현대에는 강력한 암호화 표준과 다양한 종류로 발전했으며, IT 시스템 전반에 적용되지만, 사이버 공격과 양자 컴퓨팅의 발전에 대한 대응이 필요한 기술이다.
솔트 (암호학)
암호학적 해시 함수 솔트
유형임의 데이터
기능사전 공격 완화
레인보우 테이블 공격 완화
추가 정보
관련 개념키 스트레칭

2. 솔트의 개념 및 동작 원리

솔트는 비밀번호와 같은 민감한 정보를 암호화하여 저장할 때 보안을 강화하기 위해 사용되는 무작위 문자열이다. 솔트는 비밀번호에 추가되어 해시 함수를 통해 암호화되며, 이 과정을 통해 동일한 비밀번호라도 서로 다른 해시 값을 갖게 된다.

솔트가 어떻게 작동하는지 간단한 예시를 통해 알아보자.

사용자 이름비밀번호
user1password123
user2password123



위 표와 같이 두 사용자가 동일한 비밀번호를 사용하고 있다고 가정하자. 솔트가 없다면, 이 비밀번호들은 동일한 해시 값으로 변환되어 저장될 것이다. 이는 공격자가 해시 값을 통해 원래 비밀번호를 유추하기 쉽게 만든다.

하지만 솔트를 사용하면, 각 비밀번호에 고유한 무작위 문자열이 추가된다. 예를 들어, 8바이트 길이의 솔트를 무작위로 생성하여 각 비밀번호에 추가하고 SHA256 해시 함수를 적용하면 다음과 같은 결과가 나타난다.

사용자 이름솔트값해시될 문자열해시된 값 = SHA256 (비밀번호 + 솔트값)
user1E1F53135E559C253password123E1F53135E559C25372AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8
user284B03D034B409D4Epassword12384B03D034B409D4EB4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A



위 표에서 볼 수 있듯이, 동일한 비밀번호 "password123"에 서로 다른 솔트 값이 추가되면서 완전히 다른 해시 값이 생성되었다. 이처럼 솔트는 동일한 비밀번호라도 서로 다른 해시 값을 갖도록 하여 보안을 강화한다.

솔트를 사용하면, 공격자가 레인보우 테이블을 이용하여 해시 값에서 비밀번호를 추측하기 어려워진다. 또한 솔트는 사전 공격의 효과를 줄이는데 도움이 된다.

2. 1. 솔트 생성 및 저장

솔트는 일반적으로 암호학적으로 안전한 의사 난수 생성기(CSPRNG)를 사용하여 생성되며, 예측 불가능한 무작위 문자열로 구성된다. 생성된 솔트는 비밀번호와 함께 데이터베이스에 안전하게 저장된다.[1]

솔트 생성 과정을 예시를 통해 살펴보면 다음과 같다.

사용자 이름비밀번호
user1password123
user2password123



위 표와 같이 사용자 이름과 비밀번호가 있을 때, 솔트 값을 무작위로 생성한다. 솔트의 길이는 다양할 수 있지만, 예시에서는 8바이트(64비트) 길이의 솔트를 사용한다. 평문 비밀번호에 솔트를 추가하고, 이 결과 값을 해시화하여 해시 값을 얻는다. 솔트 값과 해시 값은 데이터베이스에 저장된다.

사용자 이름솔트해시화되는 값(비밀번호 + 솔트)해시 값 = SHA256 (비밀번호 + 솔트)
user1E1F53135E559C253password123E1F53135E559C25372AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8
user284B03D034B409D4Epassword12384B03D034B409D4EB4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A



위 표에서 볼 수 있듯이, 서로 다른 솔트 값을 사용하면 동일한 비밀번호를 사용하더라도 전혀 다른 해시 값이 생성된다.[1] 이렇게 함으로써 공격자가 레인보우 테이블을 이용하여 해시 값으로부터 비밀번호를 추측하기 어렵게 만들고, 사전 공격의 효과를 줄일 수 있다. 그러나 자주 사용되거나 쉽게 추측 가능한 비밀번호에 대해서는 솔트가 효과적이지 않다.[1]

2. 2. 솔트와 비밀번호 결합

사용자가 비밀번호를 입력하면, 시스템은 데이터베이스에서 해당 사용자의 솔트를 가져와 입력된 비밀번호와 결합한다. 이 결합된 문자열은 해시 함수를 통해 암호화되어 저장된 해시 값과 비교된다.

솔트와 비밀번호를 결합하는 과정은 다음과 같다.

1. 솔트 생성: 암호학적으로 안전한 의사 난수 생성기를 사용하여 예측 불가능한 난수를 생성한다. 이 난수는 영숫자 형태일 수 있다.

2. 솔트와 비밀번호 결합: 생성된 솔트를 사용자가 입력한 비밀번호에 추가한다.

3. 해시 함수 적용: 솔트와 결합된 비밀번호 문자열을 SHA256과 같은 해시 함수를 사용하여 암호화한다.

4. 해시 값 비교: 새로 생성된 해시 값을 데이터베이스에 저장된 해시 값과 비교하여 일치 여부를 확인한다. 일치하면 인증이 성공하고, 일치하지 않으면 인증이 실패한다.

솔트가 없으면 동일한 비밀번호는 동일한 해시 값으로 매핑되어 해커가 해시 값에서 비밀번호를 추측하기가 더 쉬워질 수 있다. 하지만 솔트를 사용하면 동일한 비밀번호라도 서로 다른 해시 값을 가지게 되어 보안성이 강화된다.

다음은 솔트를 사용하여 비밀번호를 저장하는 과정을 나타내는 예시이다.

사용자 이름솔트해시화되는 값 (비밀번호 + 솔트)해시 값 = SHA256 (비밀번호 + 솔트)
`user1``E1F53135E559C253``password123E1F53135E559C253``72AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8`
`user2``84B03D034B409D4E``password12384B03D034B409D4E``B4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A`



위 표에서 볼 수 있듯이, 서로 다른 솔트 값은 평문 비밀번호가 동일하더라도 완전히 다른 해시 값을 생성한다. 이는 레인보우 테이블 공격을 어렵게 만들고, 사전 공격의 효과를 줄여준다.

2. 3. 해시 함수와의 연관성

솔트는 해시 함수와 함께 사용되어 비밀번호를 암호화한다. 해시 함수는 임의의 길이의 데이터를 고정된 길이의 해시 값으로 변환하는 단방향 함수이다. 솔트와 비밀번호를 결합한 후 해시 함수를 적용하면, 동일한 비밀번호라도 서로 다른 솔트로 인해 완전히 다른 해시 값이 생성된다.

솔트가 없으면 동일한 비밀번호는 동일한 해시 값으로 매핑되어 해커가 해시 값에서 비밀번호를 추측하기가 더 쉬워질 수 있다.

사용자 이름해싱할 문자열해시 값 = SHA256
user1password123EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F
user2password123EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F



대신 솔트를 생성하여 각 비밀번호에 추가하면 동일한 비밀번호에 대해서도 다른 해시 값을 얻을 수 있다.

사용자 이름솔트 값해싱할 문자열해시 값 = SHA256 (비밀번호 + 솔트 값)
user1D;%yL9TS:5PalS/dpassword123D;%yL9TS:5PalS/d9C9B913EB1B6254F4737CE947EFD16F16E916F9D6EE5C1102A2002E48D4C88BD
user2)<,-*password123)<,-*6058B4EB46BD6487298B59440EC8E70EAE482239FF2B4E7CA69950DFBD5532F2



솔트와 해시는 데이터베이스에 저장된다. 나중에 사용자가 입력한 비밀번호가 올바른지 테스트하기 위해 동일한 프로세스를 수행할 수 있다. 즉, 해당 사용자의 솔트를 비밀번호에 추가하고 결과 해시를 계산하여 저장된 해시 값과 비교한다. 결과가 저장된 해시와 일치하지 않으면 입력된 비밀번호가 올바르지 않다고 판단할 수 있다.

다음은 솔트를 사용하여 비밀번호를 저장하는 절차를 예시와 함께 보여준다.

아래 표는 사용자 이름과 비밀번호 조합 2개를 보여준다. 여기서는 아직 비밀번호가 저장되지 않았다.

사용자 이름비밀번호
user1password123
user2password123



솔트 값은 무작위로 생성되며 길이는 어느 것이든 상관없다. 이 예제에서는 솔트의 길이를 8바이트(64비트)로 한다. 평문 비밀번호에 솔트를 추가하고, 그 결과를 해시화한다. 이 결과 값을 해시 값이라고 부른다. 솔트 값과 해시 값을 저장소에 저장한다.

사용자 이름솔트해시화되는 값(비밀번호 + 솔트)해시 값 = SHA256 (비밀번호 + 솔트)
user1E1F53135E559C253password123E1F53135E559C25372AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8
user284B03D034B409D4Epassword12384B03D034B409D4EB4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A



위의 표에서 보듯이 솔트 값이 다르면, 평문 비밀번호가 같더라도 생성되는 해시 값은 전혀 달라진다.

게다가 공격자가 해시 값을 미리 계산하는 것을 어렵게 만들어 사전 공격의 효과를 줄일 수 있다. 다만, 자주 사용되는 비밀번호나 쉽게 추측할 수 있는 비밀번호에 대해서는 솔트가 효과가 없다.

3. 솔트 사용의 중요성

솔트는 비밀번호를 해시 함수로 암호화하기 전에 추가하는 무작위 문자열이다. 솔트를 사용하면 다음과 같은 이점이 있다.


  • 솔트가 없으면 동일한 비밀번호는 동일한 해시 값으로 매핑되어 해커가 해시 값에서 비밀번호를 추측하기가 더 쉬워진다. 그러나 솔트를 사용하면 각기 다른 솔트값들은 완전히 다른 해시 처리된 값을 만들어내며, 이는 평문 비밀번호가 완전히 동일하더라도 마찬가지이다.
  • 레인보우 테이블 공격, 사전 공격과 같은 일반적인 비밀번호 해킹 공격을 효과적으로 방어한다. 동일한 비밀번호를 사용하는 경우에도 서로 다른 솔트를 사용하면 서로 다른 해시 값이 생성되어 공격자가 여러 계정을 동시에 탈취하기 어렵게 만든다.[9]
  • 여러 비밀번호를 공격하는 사전 공격무차별 대입 공격의 속도를 늦춘다. 솔트가 없는 경우, 공격자는 추측한 비밀번호를 한 번 해시하여 모든 해시 값과 비교하면 된다. 반면 솔트가 있는 경우에는 각 비밀번호의 솔트가 다르므로, 추측한 비밀번호를 각 솔트와 함께 매번 해시해야 한다. 따라서 해시 값을 한 번만 계산하는 경우보다 속도가 현저히 감소한다.[11]
  • 레인보우 테이블을 이용한 비밀번호 크래킹을 방지한다.[17] 솔트가 충분히 길고 무작위적이라면, 레인보우 테이블에 "솔트+비밀번호" 해시 값이 존재할 가능성이 낮아진다.
  • 두 명의 사용자가 동일한 비밀번호를 사용하거나, 동일한 사용자가 두 대의 컴퓨터에서 동일한 비밀번호를 사용한 경우, 솔트가 없으면 비밀번호 파일에 동일한 해시 값으로 저장되어 동일한 비밀번호를 쓰고 있다는 사실이 드러난다. 무작위 솔트를 사용하면 두 계정이 동일한 비밀번호를 사용하더라도 해시만 보고서는 알 수 없다.[11]

3. 1. 보안 강화

솔트는 레인보우 테이블 공격, 사전 공격과 같은 일반적인 비밀번호 해킹 공격을 효과적으로 방어한다. 동일한 비밀번호를 사용하는 경우에도 서로 다른 솔트를 사용하면 서로 다른 해시 값이 생성되어 공격자가 여러 계정을 동시에 탈취하기 어렵게 만든다.[9]

솔트가 없으면 동일한 비밀번호는 동일한 해시 값으로 매핑되어 해커가 해시 값에서 비밀번호를 추측하기가 더 쉬워진다.

사용자 이름해싱할 문자열해시 값 = SHA256
user1password123EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F
user2password123EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F



하지만 솔트가 생성되어 각 비밀번호에 추가되면, 동일한 원본 비밀번호에 대해서도 결과 해시는 다른 값을 출력하게 된다.

사용자 이름솔트 값해싱할 문자열해시 값 = SHA256 (비밀번호 + 솔트 값)
user1D;%yL9TS:5PalS/dpassword123D;%yL9TS:5PalS/d9C9B913EB1B6254F4737CE947EFD16F16E916F9D6EE5C1102A2002E48D4C88BD
user2),-*password123)<,-*6058B4EB46BD6487298B59440EC8E70EAE482239FF2B4E7CA69950DFBD5532F2



솔트는 여러 비밀번호를 공격하는 사전 공격무차별 대입 공격의 속도를 늦추는 효과도 있다. 솔트가 없는 경우, 공격자는 추측한 비밀번호를 한 번 해시하여 모든 해시 값과 비교하면 된다. 반면 솔트가 있는 경우에는 각 비밀번호의 솔트가 다르므로, 추측한 비밀번호를 각 솔트와 함께 매번 해시해야 한다. 따라서 해시 값을 한 번만 계산하는 경우보다 속도가 현저히 감소한다.[11]

솔트는 레인보우 테이블을 이용한 비밀번호 크래킹을 방지하는 데에도 사용된다.[17] 솔트가 충분히 길고 무작위적이라면, 레인보우 테이블에 "솔트+비밀번호" 해시 값이 존재할 가능성이 낮아진다.

솔트의 또 다른 장점은 두 명의 사용자가 동일한 비밀번호를 사용하거나, 동일한 사용자가 두 대의 컴퓨터에서 동일한 비밀번호를 사용한 경우이다. 솔트가 없는 경우 비밀번호 파일에 동일한 해시 값으로 저장되어 동일한 비밀번호를 쓰고 있다는 사실이 드러난다. 무작위 솔트를 사용하면 두 계정이 동일한 비밀번호를 사용하더라도 해시만 보고서는 알 수 없다.

3. 2. 개인정보 보호

솔트는 사용자의 비밀번호를 안전하게 보호하여 개인정보 유출 위험을 줄이는 역할을 한다.

솔트가 없으면 동일한 비밀번호는 동일한 해시 값으로 변환되기 때문에 해커가 해시 값을 보고 비밀번호를 추측하기 더 쉬워진다. 아래 표는 솔트가 없을 때, 동일한 비밀번호를 사용하는 두 사용자의 해시 값이 같은 경우를 보여준다.

사용자 이름해싱할 문자열해시 값 = SHA256
user1password123EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F
user2password123EF92B778BAFE771E89245B89ECBC08A44A4E166C06659911881F383D4473E94F



하지만 솔트를 사용하면 각 비밀번호에 고유한 값이 추가되어, 같은 비밀번호를 사용하더라도 다른 해시 값을 갖게 된다. 아래 표는 솔트를 사용했을 때, 동일한 비밀번호를 사용하는 두 사용자의 해시 값이 달라지는 것을 보여준다.

사용자 이름솔트 값해싱할 문자열해시 값 = SHA256 (비밀번호 + 솔트 값)
user1D;%yL9TS:5PalS/dpassword123D;%yL9TS:5PalS/d9C9B913EB1B6254F4737CE947EFD16F16E916F9D6EE5C1102A2002E48D4C88BD
user2)<,-*password123)<,-*6058B4EB46BD6487298B59440EC8E70EAE482239FF2B4E7CA69950DFBD5532F2



솔트와 해시는 데이터베이스에 저장된다. 나중에 사용자가 입력한 비밀번호가 맞는지 확인할 때, 저장된 솔트를 사용하여 입력된 비밀번호의 해시 값을 계산하고, 이 값을 저장된 해시 값과 비교한다. 일치하지 않으면 올바른 비밀번호가 아니라는 것을 의미한다.

솔트는 보통 암호학적으로 안전한 의사 난수 생성기를 사용하여 만들어진다. 이렇게 생성된 예측 불가능한 난수는 영숫자일 수 있다. 보안이 낮아 권장되지 않지만, 일부 시스템에서는 타임스탬프나 간단한 카운터를 솔트 생성에 사용하기도 한다.

솔트를 사용하면 한 번의 시도로 여러 비밀번호를 해킹하는 것을 막을 수 있다.[9] 솔트가 없으면 공격자는 한 번 해시를 계산하여 여러 사용자의 비밀번호를 확인할 수 있지만, 솔트를 사용하면 각 사용자마다 다른 솔트를 사용해야 하므로 공격이 더 어려워진다.

또한 솔트는 비밀번호 해킹을 위한 사전 계산 테이블(예: 레인보우 테이블)의 사용을 막는 데에도 도움이 된다.[10] 솔트는 해시 값을 늘리고 더 큰 문자 집합에서 해시를 추출하여 사전 계산된 테이블이 해시 값을 덮을 가능성을 줄인다.

섀도 비밀번호 시스템은 비밀번호 해시 및 기타 보안 데이터를 비공개 파일에 저장하여 이러한 문제를 완화한다. 그러나 중앙 집중식 비밀번호 관리 시스템을 사용하는 다중 서버 환경에서는 여전히 솔트 사용이 중요하다.

솔트를 사용하면 두 사용자가 같은 비밀번호를 사용하더라도 비밀번호 파일에 같은 해시 문자열로 저장되지 않아, 두 계정이 동일한 비밀번호를 사용하고 있다는 사실이 드러나지 않는다.[11]

3. 3. 시스템 보안 유지

솔트는 비밀번호 데이터베이스가 유출되더라도 비밀번호가 쉽게 해독되지 않도록 보호하여 시스템 전체의 보안을 유지한다. 솔트가 없으면 동일한 비밀번호는 동일한 해시 값으로 매핑되어 해커가 해시 값에서 비밀번호를 추측하기가 더 쉬워진다. 솔트는 각 비밀번호에 추가되어 동일한 원본 비밀번호에 대해 결과 해시가 다른 값을 출력하게 만든다.

솔트와 해시는 데이터베이스에 저장된다. 나중에 사용자가 입력한 비밀번호가 올바른지 확인하기 위해 동일한 프로세스를 수행할 수 있다. 즉, 해당 사용자의 솔트를 비밀번호에 추가하고 결과 해시를 계산하여 저장된 해시와 비교한다. 결과가 일치하지 않으면 입력된 비밀번호가 올바르지 않은 것이다.

솔트는 일반적으로 암호학적으로 안전한 의사 난수 생성기를 사용하여 생성된다. 이는 예측할 수 없는 난수를 생성하도록 설계되었으며, 영숫자일 수 있다.

솔트는 비밀번호 크래킹을 위한 사전 계산 테이블의 사용을 방지한다.[10] 이러한 테이블은 일반적인 비밀번호를 해당 해시에 매핑하거나, 사전 계산된 해시 체인의 시작 및 끝 지점과 같은 더 복잡한 작업을 수행할 수 있다. 솔트는 해시를 늘리고 더 큰 문자 집합에서 해시를 추출하여 사전 계산된 테이블이 결과 해시를 덮을 가능성을 줄인다.

섀도 비밀번호 시스템은 비밀번호 해시 및 기타 보안 데이터를 비공개 파일에 저장하여 이러한 문제점을 다소 완화한다. 그러나 다중 서버 설치에서 중앙 집중식 비밀번호 관리 시스템을 사용하는 경우, 각 시스템의 루트 계정보다 중앙 시스템 관리자를 더 신뢰할 수 있으므로, 고유한 솔트 값 생성과 같은 비밀번호 해싱 알고리즘의 보안을 확인하는 것이 여전히 중요하다.

솔트의 또 다른 이점은 두 사용자가 동일한 비밀번호를 선택하거나, 한 사용자가 여러 시스템에서 동일한 비밀번호를 사용하는 경우에도 해시 값만으로는 이를 알 수 없게 한다는 것이다.[11] 솔트가 없으면 동일한 비밀번호는 동일한 해시 문자열로 저장되어 두 계정이 동일한 비밀번호를 사용한다는 사실이 드러나지만, 솔트를 사용하면 이를 숨길 수 있다.

4. 솔트 사용 시 흔히 발생하는 실수

솔트 사용 시 흔히 발생하는 실수는 다음과 같다.


  • 솔트 재사용: 모든 비밀번호에 동일한 솔트를 사용하면 보안에 취약해진다. 솔트를 재사용하면 공격자가 미리 계산된 테이블(솔트를 고려한)을 만들어 공격할 수 있게 된다.
  • 짧은 길이의 솔트 사용: 솔트의 길이가 너무 짧으면 공격자가 가능한 모든 솔트 값과 비밀번호 조합을 미리 계산하여 공격하기 쉬워진다. 일반적으로 16바이트(128비트) 이상이면 충분히 큰 값의 공간을 제공한다.


솔트 값은 무작위로 생성되며, 길이는 다양할 수 있다. 솔트 값은 평문 암호에 추가되며, 그 결과는 해시 처리된다. 솔트 값과 해시된 값은 모두 저장된다. 아래 표는 비밀번호 저장을 위해 솔트 값을 사용한 예시이다.

사용자 이름비밀번호
user1password123
user2password123



사용자 이름솔트값해시될 문자열해시된 값 = SHA256 (비밀번호 + 솔트값)
user1E1F53135E559C253password123E1F53135E559C25372AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8
user284B03D034B409D4Epassword12384B03D034B409D4EB4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A



위 표에서 각기 다른 솔트 값들은 평문 비밀번호가 동일하더라도 완전히 다른 해시 값을 생성한다.

4. 1. 솔트 재사용

모든 비밀번호에 동일한 솔트를 사용하는 것은 위험하다. 솔트를 고려하여 미리 계산된 테이블이 있으면 솔트가 무용지물이 되기 때문이다.[6]

모든 비밀번호에 고유한 솔트를 사용하는 데이터베이스에 대해 미리 계산된 테이블을 만드는 것은 계산 비용이 많이 들기 때문에 실행하기 어렵다. 그러나 모든 항목에 공통 솔트를 사용하면 그러한 테이블 (솔트를 고려한)을 만드는 것이 가능해져 공격에 성공할 수 있다.[6]

솔트 재사용은 동일한 비밀번호를 가진 사용자가 동일한 해시값을 가지도록 하여, 하나의 해시값이 뚫리면 다른 비밀번호도 손상될 수 있다. 프로그래머가 비밀번호를 해시할 때마다 매번 같은 솔트를 사용하면 이러한 문제가 발생한다. 이 경우에도 기존의 레인보우 테이블은 무효화할 수 있지만 (솔트 값이 적절하다면), 널리 사용되는 제품에 솔트가 하드 코딩되어 있다면, 거기에서 추출한 솔트를 사용하여 새로운 레인보우 테이블을 생성할 수 있다.

또한, 솔트가 고정되어 있으면 비밀번호가 같은 사용자는 해시값도 같아진다 (해시값을 만들 때 사용자 이름을 섞어 넣은 경우 제외). 따라서 하나의 해시값으로 여러 사용자를 공격하기가 쉬워진다.

4. 2. 짧은 길이의 솔트 사용

솔트의 길이가 너무 짧으면 공격자가 가능한 모든 솔트 값과 비밀번호 조합을 미리 계산하여 공격할 수 있다. 긴 길이의 솔트를 사용하면 이러한 테이블의 크기가 지나치게 커져서 사실상 불가능하게 된다.[7][8] 일반적으로 16바이트(128비트) 이상이면 충분히 큰 값의 공간을 제공하여 충돌(즉, 서로 다른 두 개의 비밀번호가 동일한 솔트를 갖게 되는 경우)의 위험을 최소화한다.

솔트가 너무 짧으면 공격자가 솔트의 모든 값과 일반적인 모든 비밀번호 조합에 대한 레인보우 테이블을 쉽게 생성할 수 있다. 긴 솔트를 사용하면 레인보우 테이블의 크기를 실현 불가능할 정도로 크게 만들 수 있다.[16]

5. 솔트 구현 방식

솔트는 무작위로 생성되며, 길이는 다양하다. 일반적으로 8바이트 길이의 솔트가 평문 암호에 추가되어 해시 처리된다. 해시된 값과 솔트 값은 모두 저장된다.

다음은 비밀번호 저장을 위한 솔트 값의 예시이다.

사용자 이름비밀번호
user1password123
user2password123



위 표는 두 사용자의 이름과 비밀번호를 보여준다. 비밀번호 자체는 저장되지 않는다.

솔트 값을 평문 암호에 추가하고 SHA256 해시 함수를 적용하면 해시된 값이 생성된다.

사용자 이름솔트값해시될 문자열해시된 값 (SHA256 적용)
user1E1F53135E559C253password123E1F53135E559C25372AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8
user284B03D034B409D4Epassword12384B03D034B409D4EB4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A



위 표와 같이, 평문 비밀번호가 동일해도 서로 다른 솔트 값을 사용하면 완전히 다른 해시 값이 생성된다.

5. 1. 유닉스 시스템에서의 솔트 구현

초기 유닉스 시스템에서는 솔트와 해시된 비밀번호를 비밀번호 파일 `/etc/passwd`에 저장했다. 초기에는 비밀번호 파일이 모든 사용자에게 공개되어 있었기 때문에, 비밀번호 보안은 오로지 일방향 함수에만 의존했다.

초기 유닉스 시스템은 12비트 솔트를 사용하여 4,096가지의 솔트 값을 가질 수 있었다.[12] 당시에는 비밀번호 길이를 8자로 제한했는데, 이는 1970년대의 컴퓨팅 및 저장 비용을 고려한 적절한 균형이었다.[13]

이후, 보안 강화를 위해 섀도 패스워드 시스템이 도입되어 해시와 솔트에 대한 접근을 제한하였다.

5. 1. 1. 1970년대 ~ 1980년대

초기 유닉스 버전에서는 비밀번호 파일 `/etc/passwd`에 솔트된 비밀번호(두 글자 무작위 솔트를 앞에 붙인 비밀번호)의 해시를 저장했다. 이 구형 유닉스 버전에서는 솔트가 솔트된 비밀번호 해시와 함께 (평문으로) passwd 파일에 저장되었다. 비밀번호 파일은 시스템의 모든 사용자가 읽을 수 있었는데, 이는 사용자 권한 소프트웨어 도구가 사용자 이름 및 기타 정보를 찾을 수 있도록 하기 위함이었다. 따라서 비밀번호 보안은 이 용도로 사용된 일방향 함수(암호화 또는 해싱)에 의해서만 보호되었다.[12] 초기 유닉스 구현은 비밀번호를 8자로 제한하고 12비트 솔트를 사용했는데, 이는 4,096가지의 솔트 값을 허용했다.[18] 이는 1970년대의 계산 및 저장 비용을 고려했을 때 적절한 균형이었다.[13][19]

5. 1. 2. 1980년대 이후

섀도 패스워드 시스템은 해시와 솔트에 대한 접근을 제한하는 데 사용되었다. 솔트는 8자, 해시는 86자이며, 패스워드 길이는 스택 오버플로우 오류를 제외하고는 사실상 무제한이다.[1]

5. 2. 웹 애플리케이션에서의 솔트 구현

웹 애플리케이션은 사용자의 비밀번호 해시 값을 데이터베이스에 저장하는 것이 일반적이다. 솔트가 없으면 성공적인 SQL 주입 공격으로 쉽게 크래킹 가능한 비밀번호가 유출될 수 있다. 많은 사용자가 여러 사이트에서 비밀번호를 재사용하기 때문에 솔트 사용은 전반적인 웹 애플리케이션 보안의 중요한 구성 요소이다.[14] 특정 언어 또는 라이브러리(PHP, .NET 라이브러리 등)에서 비밀번호 해시를 보호하기 위해 솔트를 사용하는 데 대한 추가 자료는 외부 링크 섹션에서 찾을 수 있다.

비밀번호 저장을 위한 솔트 값의 불완전한 예시는 다음과 같다. 최초 테이블은 2개의 사용자 이름과 비밀번호 조합을 갖는다. 비밀번호는 저장되지 않는다.

사용자 이름비밀번호
user1password123
user2password123



솔트값은 랜덤으로 생성되며 길이는 어느 것이든 될 수 있다. 이 경우 솔트값은 8바이트 길이이다. 솔트값은 평문 암호에 추가되며 여기서 결과는 해시 처리되는데 이를 해시된 값으로 부른다. 솔트값과 해시된 값 모두 저장된다.

사용자 이름솔트값해시될 문자열해시된 값 = SHA256 (비밀번호 + 솔트값)
user1E1F53135E559C253password123E1F53135E559C25372AE25495A7981C40622D49F9A52E4F1565C90F048F59027BD9C8C8900D5C3D8
user284B03D034B409D4Epassword12384B03D034B409D4EB4B6603ABC670967E99C7E7F1389E40CD16E78AD38EB1468EC2AA1E62B8BED3A



위 표에서 각기 다른 솔트값들은 완전히 다른 해시 처리된 값을 만들어내며 이는 평문 비밀번호가 완전히 동일하더라도 마찬가지이다.

6. 한국 사회와 솔트

주어진 원본 소스(source)에 내용이 없으므로, '한국 사회와 솔트' 섹션에 내용을 추가할 수 없습니다. (이전 출력과 동일)

참조

[1] 웹사이트 NIST Special Publication 800-63-3 https://nvlpubs.nist[...] 2017-06
[2] 서적 Security engineering: a guide to building dependable distributed systems 2020
[3] Blog Passwords Matter http://bugcharmer.bl[...] 2016-12-09
[4] 서적 A Graduate Course in Applied Cryptography https://crypto.stanf[...] 2020-01-04
[5] 서적 The Joy of Cryptography 2021-01-03
[6] 웹사이트 Secure Salted Password Hashing - How to do it Properly https://crackstation[...] 2021-03-19
[7] 서적 Handbook of Applied Cryptography CRC Press
[8] 웹사이트 Secure Salted Password Hashing - How to do it Properly https://crackstation[...]
[9] 웹사이트 Password Storage - OWASP Cheat Sheet Series https://cheatsheetse[...] 2021-03-19
[10] 웹사이트 How Rainbow Tables work http://kestas.kuliuk[...]
[11] 서적 Computer security: principles and practice 2015
[12] 웹사이트 Password Security: A Case History http://cm.bell-labs.[...] 1978-04-03
[13] 서적 Practical UNIX and Internet Security O'Reilly Media 2003
[14] 웹사이트 ISC Diary – Hashing Passwords http://www.dshield.o[...] Dshield.org 2011-10-15
[15] 웹사이트 Passwords Matter http://bugcharmer.bl[...] 2019-02-13
[16] 웹사이트 Secure Salted Password Hashing - How to do it Properly https://crackstation[...] 2019-02-14
[17] 웹사이트 How Rainbow Tables work http://kestas.kuliuk[...] 2019-02-14
[18] 웹사이트 Password Security: A Case History http://cm.bell-labs.[...] Bell Laboratories 2019-02-14
[19] 웹사이트 How Unix Implements Passwords [Book] https://www.safaribo[...] 2019-02-14
[20] 웹사이트 ISC Diary Hashing Passwords http://www.dshield.o[...] Dshield.org 2019-02-14
[21] 웹인용 Passwords Matter http://bugcharmer.bl[...] 2016-12-09



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com