암호 소금은 레인보우 테이블 공격에 어떻게 도움이됩니까?


220

암호에 대한 소금의 목적을 이해하는 데 문제가 있습니다. 무지개 테이블 공격을 막는 것이 주된 용도라는 것을 이해하고 있습니다. 그러나 이것을 구현하는 것으로 보았던 방법으로 실제로 문제가 더 어려워지는 것은 아닙니다.

소금을 다음과 같이 사용할 것을 제안하는 많은 자습서를 보았습니다.

$hash =  md5($salt.$password)

해시는 이제 원래 비밀번호가 아니라 비밀번호와 솔트의 조합으로 매핑된다는 추론입니다. 그러나 말을 $salt=foo하고 $password=bar$hash=3858f62230ac3c915f300c664312c63f. 이제 레인보우 테이블을 가진 사람은 해시를 되돌리고 입력 "foobar"를 얻을 수 있습니다. 그런 다음 모든 암호 조합 (f, fo, foo, ... oobar, obar, bar, ar, ar)을 시도 할 수 있습니다. 암호를 얻는 데 몇 밀리 초가 더 걸릴 수 있지만 그다지 많지는 않습니다.

내가 본 다른 용도는 Linux 시스템에서 사용됩니다. / etc / shadow에서 해시 된 비밀번호는 실제로 salt 와 함께 저장 됩니다 . 예를 들어, "foo"의 소금과 "bar"의 암호는 다음과 같이 해시됩니다 $1$foo$te5SBM.7C25fFDu6bIRbX1. 해커가 어떻게 든이 파일을 손에 넣을 수 있다면 리버스 해시에 te5SBM.7C25fFDu6bIRbX"foo"가 포함되어 있기 때문에 소금이 어떤 용도로 사용되는지 알 수 없습니다 .

누구든지 이것을 비출 수있는 빛에 감사드립니다.

편집 : 도움을 주셔서 감사합니다. 내가 이해하는 것을 요약하면 솔트는 해시 된 암호를보다 복잡하게 만들어 사전 계산 된 레인보우 테이블에 존재하지 않을 가능성을 줄입니다. 내가 전에 오해했던 것은 무지개 테이블이 모든 해시에 존재한다고 가정하고 있다는 것입니다.




또한 여기서 업데이트-md5 해싱 사용은 더 이상 모범 사례가 아닙니다. stackoverflow.com/questions/12724935/salt-and-passwords
StuartLC

편집 해 주셔서 감사합니다. 나는 분명히 의심되는 동일한 의심을 가졌다. 따라서 'Salt'의 요점은 Rainbow 테이블이 처음에 간음 된 (salted) 암호의 해시를 포함하지 않을 가능성을 높이는 것입니다. : D
Vaibhav

답변:


237

공개 소금은 단일 암호를 해독 할 때 사전 공격을 어렵게 만들지 않습니다 . 지적했듯이 공격자는 해시 된 암호와 솔트에 모두 액세스 할 수 있으므로 사전 공격을 실행할 때 암호를 해독하려고 할 때 알려진 솔트를 사용할 수 있습니다.

공개 소금은 두 가지 작업을 수행합니다. 많은 암호 목록을 해독하는 데 시간이 많이 걸리고 레인보우 테이블을 사용할 수 없습니다.

첫 번째 파일을 이해하려면 수백 개의 사용자 이름과 비밀번호가 포함 된 단일 비밀번호 파일을 상상해보십시오. 소금이 없으면 "md5 (attempt [0])"을 계산 한 다음 파일을 스캔하여 해시가 어디에나 나타나는지 확인할 수 있습니다. 소금이 있으면 "md5 (salt [a] .temp [0])"을 계산하고 항목 A와 비교 한 다음 "md5 (salt [b] .try [0])"을 계산하고 항목 B와 비교해야합니다. 등등. 이제 n해야 할 일이 많았습니다 n. 파일에 포함 된 사용자 이름과 비밀번호의 수는 어디 입니까?

두 번째 것을 이해하려면 무지개 테이블이 무엇인지 이해해야합니다. 레인보우 테이블은 일반적으로 사용되는 암호에 대한 사전 계산 된 해시 목록입니다. 소금이없는 비밀번호 파일을 다시 상상해보십시오. 내가해야 할 일은 파일의 각 줄을 통과하고 해시 된 암호를 꺼내 무지개 테이블에서 찾아 보는 것입니다. 단일 해시를 계산할 필요가 없습니다. 조회가 해시 함수 (아마도)보다 상당히 빠르면 파일 크래킹 속도가 상당히 빨라집니다.

그러나 암호 파일이 솔트 된 경우 레인보우 테이블에는 "salt. password"가 미리 해시되어 있어야합니다. 소금이 충분히 무작위 적이라면, 이것은 거의 불가능합니다. 일반적으로 자주 사용되는 미리 해시 된 비밀번호 (무지개 테이블) 목록에 "hello"및 "foobar"및 "qwerty"와 같은 항목이있을 수 있지만 "jX95psDZhello"또는 "LPgB0sdgxfoobar"또는 "dZVUABJtqwerty"가 사전 계산되었습니다. 그것은 무지개 테이블을 엄청나게 크게 만들 것입니다.

따라서 소금은 공격자를 시도당 행당 한 번의 계산으로 다시 줄여줍니다.이 암호는 충분히 길고 임의의 암호와 결합 될 때 (일반적으로 말하면) 깨지지 않습니다.


15
나는 그들이 대답했다는 것을 알기 위해 내 대답에서 무엇을 말했는지 잘 모르겠습니다.
Ross

2
에릭슨, 편집이 혼란 스러웠습니다. 대부분의 사람들은 레인보우 테이블 공격을 일종의 사전 공격이라고 생각하지 않습니다. 내 대답에 혼란 스러울 수 있다고 생각되는 것이 있으면 알려 주시면 해결하겠습니다.
Ross

나는 하나 이상의 공감대를 줄 수 있기를 바랍니다! 특히 첫 번째 단락에서. 그것은 모든 IMHO를 요약합니다
Cesar

5
나는 이것이 오래되었다는 것을 알고 있지만 무지개 테이블에 대한 설명이 잘못되었습니다. 대신 해시 테이블을 설명하고 있습니다. 레인보우 테이블은 security.stackexchange.com/questions/379/…를 참조하십시오 . 해시 테이블에는 암호를 해시에 대한 1 대 1 매핑이 있지만 레인보우 테이블에는 해시를 일반 텍스트로 다시 변환하고 수천 번 다시 해시하여 초기 일반 텍스트와 최종 해시 만 저장하는 축소 기능이 필요합니다. 검색은 해시 테이블보다 계산 시간이 길지만 해시 당 많은 일반 텍스트를 '캡처'합니다.
Mark Fisher

1
이 답변은 솔트를 사용하지 않으면 (특정 사용자에 대한 암호 해시 생성에 바인딩 됨) 이러한 암호를 저장하는 여러 테이블에 걸쳐 중복 암호를 노출한다는 사실을 놓칩니다. 최소한 개인이 재사용 한 암호를 식별 할 수 있지만, 다른 데이터베이스에서 다른 사람이 사용하는 암호도 식별하는 것이 더 나쁩니다.
Maarten Bodewes

119

다른 답변은 주제에 대한 오해를 다루지 않는 것 같습니다.

소금의 두 가지 다른 용도

소금을 다음과 같이 사용할 것을 제안하는 많은 자습서를 보았습니다.

$hash = md5($salt.$password)

[...]

내가 본 다른 용도는 Linux 시스템에서 사용됩니다. / etc / shadow에서 해시 된 비밀번호는 실제로 salt와 함께 저장됩니다.

당신은 항상 있기 때문에 사용자가 암호 데이터베이스에 입력 한 내용을 검증하기 위해 암호로 소금을 저장해야, 당신은 소금, 해시를 함께 입력을 결합해야하며, 저장된 해시와 비교합니다.

해시의 보안

이제 레인보우 테이블을 가진 사람은 해시를 뒤집어 입력 "foobar"를 만들 수 있습니다.

[...]

te5SBM.7C25fFDu6bIRbX의 리버스 해시는 "foo"를 포함하는 것으로 알려져 있습니다.

해시를 그와 같이 되돌릴 수는 없습니다 (적어도 이론적으로는). "foo"의 해시와 "saltfoo"의 해시는 공통점 이 없습니다 . 암호화 해시 함수의 입력에서 1 비트라도 변경하면 출력이 완전히 변경됩니다.

즉, 일반적인 암호로 레인보우 테이블을 만든 다음 나중에 소금으로 "업데이트"할 수 없습니다. 처음부터 소금을 고려해야합니다.

이것이 처음에 무지개 테이블이 필요한 이유입니다. 해시에서 암호를 얻을 수 없기 때문에 가장 많이 사용되는 암호의 모든 해시를 미리 계산 한 다음 해시와 해시를 비교합니다.

소금의 품질

하지만 말해 $salt=foo

"foo"는 극히 소금 선택 이 될 것 입니다. 일반적으로 ASCII로 인코딩 된 임의의 값을 사용합니다.

또한 각 암호에는 시스템의 다른 모든 소금과 다른 소금이 있습니다. 이 수단, 공격자가 희망 필요없이 개별적으로 대신 각 암호를 공격하는 것을 하나의 해시의 그녀 데이터베이스에있는 값 중 하나와 일치합니다.

공격

해커가 어떻게 든이 파일을 손에 넣을 수 있다면 소금이 어떤 용도로 사용되는지 알 수 없습니다.

레인보우 테이블 공격에는 항상 필요 /etc/passwd하거나 사용되는 비밀번호 데이터베이스가 필요 합니까? 아니면 레인보우 테이블의 해시와 실제 비밀번호의 해시를 어떻게 비교 하시겠습니까?

목적 : 공격자가 자주 사용하는 10 만 개의 영어 단어와 일반적인 암호 ( "비밀"이라고 생각)에 대한 레인보우 테이블을 만들고 싶다고 가정 해 봅시다. 소금이 없으면 100,000 개의 해시를 미리 계산해야합니다. 전통적인 2 가지 문자 (각각 64 가지 선택 중 하나임)의 유닉스 솔트를 [a–zA–Z0–9./]사용하더라도 4,096,000,000 개의 해시를 계산하고 저장해야합니다.


2
정말 좋은 답변입니다. 그것은 훨씬 더 잘 이해하는 데 도움이되었습니다. +1
wcm

해커가 소금에 접근 할 수 있고 해싱 함수에서 소금이 어떻게 사용되었는지를 염두에두고 소금에 절인 해시 테이블을 생성하고 해당 해시를 레인보우 테이블과 비교하는 데 사용할 수 없었습니까?
Jonny

5
@Jonny "소금"이 없습니다. 요점은 소금이 모든 암호 입력에 대해 다르다는 것입니다.

86

소금에 대한 아이디어는 일반적인 문자 기반 암호보다 무차별 대입으로 추측하기가 훨씬 어렵다는 것입니다. 레인보우 테이블은 종종 특수 문자 세트를 염두에두고 만들어지며 가능한 모든 조합을 포함하지는 않습니다 (가능한 경우도 있음).

따라서 좋은 소금 값은 임의의 128 비트 이상의 정수입니다. 이것이 레인보우 테이블 공격에 실패하는 이유입니다. 저장된 각 암호에 대해 다른 소금 값을 사용하면 하나의 소금 값에 대해 만들어진 레인보우 테이블 (단일 소금 값을 가진 인기있는 시스템 인 경우와 같이)로 모든 사람에게 액세스 할 수 없도록해야합니다 한 번에 비밀번호.


1
+1 : 솔트는 난수 생성기에 의해 생성 된 임의의 문자열의 16 진수 다이제스트의 일부일 수 있습니다. 각 비트는 무작위입니다.
S.Lott

5
"레인보우 테이블은 저장 공간을 절약하기 위해 약간의 속도를 제공하는 사전 공격의 한 형태입니다." -실제로 그 반대의 경우, 좋은 무지개 테이블은 모든 가능한 값을 다시 해싱하는 시간을 절약하기 위해 저장하는 데 GB가 걸릴 수 있습니다.
AviD

2
동의-@erickson, 편집 내용이 잘못되었다고 생각합니다. 레인보우 테이블에는 많은 양의 스토리지 가 필요 하지만 해시 뒤에 메시지를 빠르게 가져올 수 있습니다.
Carl Seleborg

3
글쎄, 둘 다 맞아. 레인보우 테이블은 표준 사전 공격과 비교하여 저장 공간을 절약하기 위해 속도를 희생합니다. 반면, 무차별 대입 공격에 비해 레인보우 테이블은 (많은) 공간을 사용하여 속도를 얻습니다. 오늘날 레인보우 테이블은 거의 사전과 동의어입니다.
Rasmus Faber

... 공격이지만 사전 공격에는 레인보우 테이블이 필요하지 않습니다.
Rasmus Faber

35

또 하나의 위대한 질문이 있습니다.

내가 명시 적으로 언급하지 않은 한 가지 작은 점은 각 암호에 임의의 소금을 추가 하여 동일한 암호를 선택한 두 명의 사용자가 서로 다른 해시를 생성 한다는 것을 실제로 보장한다는 것입니다.

이것이 왜 중요한가?

미국 북서부의 큰 소프트웨어 회사에서 암호 데이터베이스를 상상해보십시오. 여기에 30,000 개의 항목이 있고 그 중 500 개에 비밀번호 bluescreen 이 있다고 가정하십시오 . 해커가 사용자로부터 IT 부서로 이메일로 암호를 읽어이 암호를 획득한다고 가정 해보십시오. 암호를 입력하지 않으면 해커는 데이터베이스에서 해시 된 값을 찾은 다음 단순히 패턴 일치하여 다른 499 계정에 액세스 할 수 있습니다.

암호를 지정하면 500 개 계정 각각에 고유 한 (소트 + 암호) 계정이 있으며 각 계정마다 다른 해시를 생성하여 단일 계정으로의 위반을 줄입니다. 그리고 전자 메일 메시지에 일반 텍스트 암호를 작성하기에 충분한 순진한 사용자가 다음 OS에 대해 문서화되지 않은 API에 액세스 할 수 없게되기를 바랍니다.


다른 비밀번호를 선택하는 두 명의 사용자에 대해서도 동일하며 DB에 동일한 해시 비밀번호가 저장되어있을 가능성이 있습니다. (쓸모없는 ... 알아요)
앤트

15

소금을 바르는 좋은 방법을 찾고 있었고 샘플 코드가있는이 훌륭한 기사를 발견했습니다.

http://crackstation.net/hashing-security.htm

저자는 사용자 당 임의의 소금을 사용하도록 권장하므로 소금에 액세스해도 해시 전체 목록을 쉽게 해독 할 수 없습니다.

비밀번호를 저장하려면

  • CSPRNG를 사용하여 긴 무작위 소금을 생성하십시오.
  • 소금에 암호를 붙이고 SHA256과 같은 표준 암호화 해시 기능으로 해시하십시오.
  • 사용자의 데이터베이스 레코드에 솔트와 해시를 모두 저장하십시오.

비밀번호를 확인하려면

  • 데이터베이스에서 사용자의 솔트 및 해시를 검색하십시오.
  • 주어진 암호에 솔트를 붙이고 동일한 해시 함수를 사용하여 해시하십시오.
  • 제공된 비밀번호의 해시와 데이터베이스의 해시를 비교하십시오. 일치하면 암호가 올바른 것입니다. 그렇지 않으면 비밀번호가 올바르지 않습니다.

3
Hashcat은 단일 PC를 사용하여 초당 약 170 억 개의 소금에 절인 SHA256 해시를 시도 할 수 있습니다. 링크 된 기사의 저자는 "암호 크래킹 만들기 : 느린 해시 함수"라는 제목으로 이에 대해 이야기합니다. scrypt, bcrypt 및 PBKDF2는 좋은 선택이며 서버 IMHO의 추가 CPU주기보다 가치가 있습니다. Argon2는 현재 최첨단 기술이지만 다른 테스트와는 달리 전투 테스트를 거치지 않았습니다.
kgriffs

12

소금이 무지개 테이블 공격에 실패 할 수있는 이유는 n 비트 소금의 경우 무지개 테이블이 소금이없는 테이블 크기보다 2 ^ n 배 더 커야하기 때문입니다.

'foo'를 소금으로 사용하는 예는 무지개 테이블을 1600 만 배 더 크게 만들 수 있습니다.

Carl이 128 비트 솔트를 예로 들었을 때, 이로 인해 테이블이 2 ^ 128 배 더 커집니다. 이제는 더 커집니다. 또 다른 방법으로, 휴대용 스토리지가 얼마나 큰지 얼마나 오래 걸립니까?


8
하나의 전자를 사용하여 비트를 저장하더라도 은하 휴대용을 통해 이동하는 태양계를 고려하지 않는 한 누군가가 그 용량의 휴대용 저장 장치를 생산하기까지는 꽤 오래 걸릴 것입니다.
erickson 2012 년

10

해시 기반 암호화를 차단하는 대부분의 방법은 무차별 대입 공격에 의존합니다. 레인보우 공격은 본질적으로보다 효율적인 사전 공격이며, 저렴한 디지털 스토리지를 사용하여 가능한 암호의 상당 부분을 해시에 매핑하고 역 매핑을 용이하게하도록 설계되었습니다. 이러한 유형의 공격은 많은 암호가 상당히 짧거나 몇 가지 패턴의 단어 기반 형식 중 하나를 사용하기 때문에 작동합니다.

이러한 공격은 암호에 더 많은 문자가 포함되어 있고 일반적인 단어 기반 형식을 따르지 않는 경우에는 효과적이지 않습니다. 시작하기에 강력한 암호를 가진 사용자는 이러한 유형의 공격에 취약하지 않습니다. 불행히도 많은 사람들이 좋은 암호를 선택하지 않습니다. 그러나 타협이 있으므로 임의 정크를 추가하여 사용자 비밀번호를 향상시킬 수 있습니다. 따라서 이제 "hunter2"대신 암호가 "hunter2908! fld2R75 {R7 /; 508PEzoz ^ U430"이 될 수 있으며 이는 훨씬 강력한 암호입니다. 그러나 이제이 추가 암호 구성 요소를 저장해야하므로 더 강력한 복합 암호의 효율성이 떨어집니다. 알다시피, 지금까지 각 암호, 심지어 약한 암호까지도 이러한 체계에 순 이익이 있습니다. 더 이상 동일한 사전 계산 된 해시 / 레인보우 테이블에 취약하지 않습니다. 대신, 각 비밀번호 해시 항목은 고유 한 해시 테이블에만 취약합니다.

암호 강도 요구 사항이 약한 사이트가 있다고 가정합니다. 모든 해시에서 비밀번호 솔트를 사용하지 않는 경우 미리 계산 된 해시 테이블에 취약한 경우 해시에 액세스 할 수있는 사용자는 대부분의 사용자에 대해 비밀번호에 액세스 할 수 있습니다. 상당한 비율). 상수 암호 솔트를 사용하는 경우 사전 계산 된 해시 테이블은 더 이상 가치가 없으므로 누군가가 해당 솔트에 대한 사용자 정의 해시 테이블을 계산하는 데 시간을 소비해야하지만 더 큰 순열을 다루는 테이블을 계산하면 점진적으로 그렇게 할 수 있습니다 문제 공간의. 가장 취약한 암호 (예 : 간단한 단어 기반 암호, 매우 짧은 영숫자 암호)는 몇 시간 또는 며칠 내에 금이 갈 것이고, 취약한 암호는 몇 주 또는 몇 달 후에 금이 갈 것입니다. 시간이 지남에 따라 공격자는 점점 더 많은 사용자의 암호를 액세스 할 수 있습니다. 모든 비밀번호에 고유 한 소금을 사용하는 경우 해당 취약한 비밀번호 각각에 액세스하는 데 며칠 또는 몇 달이 걸릴 수 있습니다.

보시다시피, 소금이없는 소금에서 일정한 소금으로, 독특한 소금으로 올라갈 때 각 단계에서 취약한 암호를 해독하기위한 노력이 몇 배나 증가합니다. 소금이 없으면 사용자 암호 중 가장 취약한 부분은 쉽게 접근 할 수 있고, 일정한 소금으로 약한 암호로 결정된 공격자가 접근 할 수 있으며, 고유 한 소금으로 암호 액세스 비용이 높아져 가장 결정된 공격자 만 액세스 할 수 있습니다 취약한 암호의 작은 하위 집합에 비용이 많이 든다.

사용자가 암호를 잘못 선택하는 것을 완전히 막을 수는 없지만 사용자 암호를 손상시키는 비용을 한 사용자의 암호조차도 엄청나게 비싸게 만드는 수준으로 올릴 수 있습니다.


3

솔팅의 한 가지 목적은 미리 계산 된 해시 테이블을 물리 치는 것입니다. 누군가 미리 계산 된 수백만 개의 해시 목록이있는 경우 해시와 소금을 알고 있지만 테이블에서 $ 1 $ foo $ te5SBM.7C25fFDu6bIRbX1을 조회 할 수 없습니다. 그들은 여전히 ​​그것을 강제해야합니다.

Carl S가 언급 한 또 다른 목적은 무차별 해시 목록을 더 비싸게 만드는 것입니다. (다양한 소금을 줘)

소금이 공개 되더라도이 두 목표는 여전히 달성됩니다.


1

내가 아는 한, 소금은 사전 공격을 더 어렵게 만듭니다.

많은 사람들이 무작위 문자열 대신 암호에 공통 단어를 사용한다는 것은 알려진 사실입니다.

따라서 해커는 이것을 무차별 한 힘 대신에 자신의 이점으로 사용할 수 있습니다. 그는 aaa, aab, aac ...와 같은 비밀번호를 찾지 않고 대신 단어와 일반적인 비밀번호를 사용합니다 (반지 이름의 주인과 같이!))

따라서 내 비밀번호가 레골라스라면 해커는이를 시도하고 "몇 안되는"시도로 추측 할 수 있습니다. 그러나 암호에 소금을 입히고 fooLegolas가되면 해시가 달라 지므로 사전 공격이 실패합니다.

희망이 도움이됩니다!


-2

나는 당신이 PHP를 사용한다고 가정합니다 --- md5 () 함수와 $ 선행 변수 ---, 당신은이 기사를 볼 수 있습니다 Shadow Password HOWTO 특별히 11 번째 단락.

또한 메시지 다이제스트 알고리즘을 사용하는 것이 두렵습니다. mcrypt 모듈에서 제공하는 것과 같은 실제 암호 알고리즘 또는 mhash 모듈 을 제공하는 것과 같은 더 강력한 메시지 다이제스트 알고리즘 (sha1, sha256 및 기타).

더 강력한 메시지 다이제스트 알고리즘이 필수적이라고 생각합니다. MD5와 SHA1에 충돌 문제가있는 것으로 알려져 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.