[security] 해시를 위해 소금을 숨길 필요성

직장에서 우리는 소금에 대한 두 가지 경쟁 이론을 가지고 있습니다. 내가 작업하는 제품은 사용자 이름이나 전화 번호와 같은 것을 사용하여 해시를 솔트합니다. 본질적으로 각 사용자마다 다르지만 우리가 쉽게 사용할 수있는 것입니다. 다른 제품은 각 사용자에 대해 무작위로 솔트를 생성하고 사용자가 암호를 변경할 때마다 변경합니다. 그런 다음 솔트는 데이터베이스에서 암호화됩니다.

내 질문은 두 번째 접근 방식이 정말로 필요한지 여부입니다. 순전히 이론적 관점에서 첫 번째 접근 방식보다 더 안전하다는 것을 이해할 수 있지만 실용성 관점에서는 어떨까요? 현재 사용자를 인증하려면 솔트가 암호화되지 않고 로그인 정보에 적용되어야합니다.

그것에 대해 생각한 후, 나는이 접근 방식에서 진정한 보안 이득을 보지 못했습니다. 계정에서 계정으로 솔트를 변경하면 공격자가 각 계정에 대한 것이 무엇인지 신속하게 파악하는 방법을 알고 있더라도 누군가가 해싱 알고리즘을 무차별 대입하려고 시도하는 것은 매우 어렵습니다. 이것은 암호가 충분히 강력하다는 가정하에 진행됩니다. (분명히 두 자리 숫자 인 비밀번호 세트에 대해 올바른 해시를 찾는 것이 8 자리 비밀번호의 올바른 해시를 찾는 것보다 훨씬 쉽습니다). 내 논리가 잘못되었거나 내가 놓친 것이 있습니까?

편집 : 좋아 그래서 여기에 내가 소금을 암호화하는 것이 정말로 논쟁이라고 생각하는 이유가 있습니다. (내가 올바른 길을 가고 있는지 알 수 있음).

다음 설명에서는 암호가 항상 8 자이고 솔트가 5이고 모든 암호가 소문자로 구성되어 있다고 가정합니다 (수학이 더 쉬워 짐).

각 항목에 대해 다른 소금을 사용한다는 것은 동일한 무지개 테이블을 사용할 수 없음을 의미합니다 (실제로는 충분한 크기의 테이블이 있으면 사용할 수 있지만 지금은 무시하겠습니다). 이것이 내가 이해하는 소금의 진정한 열쇠입니다. 왜냐하면 모든 계정을 깨뜨리기 위해서는 각각에 대해 말할 수 있도록 바퀴를 재발 명해야하기 때문입니다. 이제 해시를 생성하기 위해 올바른 솔트를 암호에 적용하는 방법을 안다면 솔트가 실제로 해시 된 구문의 길이 / 복잡성을 확장하기 때문에 그렇게 할 것입니다. 그래서 나는 내가 소금이 무엇인지 알고 있기 때문에 암호 + 소금을 13 ^ 26에서 8 ^ 26으로 “알기”위해 생성해야 할 가능한 조합의 수를 줄일 것입니다. 이제는 더 쉬워 지지만 여전히 정말 어렵습니다.

그래서 소금을 암호화합니다. 솔트가 암호화되어 있다는 것을 안다면 먼저 암호화를 시도하거나 해독하지 않을 것입니다 (충분한 수준의 암호화가 있다고 가정 할 때). 나는 그것을 무시할 것이다. 암호를 해독하는 방법을 알아내는 대신 이전 예제로 돌아가서 13 ^ 26에 대한 모든 키를 포함하는 더 큰 무지개 테이블을 생성합니다. 소금을 모르면 확실히 속도가 느려지지만 소금 암호화를 먼저 해독하려는 기념비적 인 작업을 추가하지는 않을 것입니다. 그럴 가치가 없다고 생각하는 이유입니다. 생각?

다음은 무차별 대입 공격시 암호가 얼마나 오래 유지되는지 설명하는 링크입니다.
http://www.lockdown.co.uk/?pg=combi



답변

여기서 대답은 당신이 정말로 보호하려는 것이 무엇인지 스스로에게 물어 보는 것입니다. 누군가 데이터베이스에 액세스 할 수있는 경우 암호화 된 솔트에 액세스 할 수 있으며 사용자 코드에도 액세스 할 수 있습니다. 그들은 암호화 된 솔트를 해독 할 수 있습니까? 그렇다면 암호화는 어쨌든 거의 쓸모가 없습니다. 소금은 실제로 그것을 만들기 위해 존재하므로 전체 암호 데이터베이스가 침입 당하면 한 번에 전체 암호 데이터베이스를 크래킹하는 무지개 테이블을 형성하는 것은 불가능합니다. 이러한 관점에서 각 솔트가 고유 한 한 차이가없는 한 각 암호에 대해 솔트 또는 암호화 된 솔트를 사용하여 무차별 대입 공격이 필요합니다.


답변

소금을 숨길 필요는 없습니다.

해시마다 다른 솔트를 사용해야합니다. 실제로 이것은 암호화 품질 난수 생성기에서 8 바이트 이상을 가져 오면 쉽게 얻을 수 있습니다.

A로부터 내 이전의 대답 :

Salt는 사전 계산 된 사전 공격을 막는 데 도움이됩니다.

공격자가 가능한 암호 목록을 가지고 있다고 가정합니다. 그는 각각을 해시하고 피해자의 암호 해시와 비교하여 일치하는지 확인할 수 있습니다. 목록이 크면 시간이 오래 걸릴 수 있습니다. 그는 다음 목표에 그렇게 많은 시간을 보내고 싶지 않기 때문에 해시가 해당 입력을 가리키는 “사전”에 결과를 기록합니다. 암호 목록이 매우 길면 Rainbow Table과 같은 기술을 사용하여 공간을 절약 할 수 있습니다.

그러나 그의 다음 대상이 암호를 솔트했다고 가정합니다. 공격자가 솔트가 무엇인지 알고 있더라도 사전 계산 된 테이블은 쓸모가 없습니다. 솔트는 각 암호의 결과로 해시를 변경합니다. 그는 자신의 목록에있는 모든 암호를 다시 해시하고 대상의 솔트를 입력에 추가해야합니다. 각기 다른 솔트에는 다른 사전이 필요하며 충분한 솔트가 사용되면 공격자는 모두에 대한 사전을 저장할 공간이 없습니다. 시간 절약을위한 거래 공간은 더 이상 선택 사항이 아닙니다. 공격자는 공격하려는 각 대상에 대해 자신의 목록에있는 각 암호를 해싱해야합니다.

따라서 소금을 비밀로 유지할 필요는 없습니다. 공격자가 특정 솔트에 해당하는 사전 계산 된 사전이 없는지 확인하는 것으로 충분합니다.


이것에 대해 조금 더 생각 해보니 소금이 숨겨 질 수 있다고 생각하도록 속이는 것이 위험하다는 것을 깨달았습니다. 소금을 숨길 수 없다고 가정하고 시스템을 안전하게 설계하는 것이 훨씬 낫습니다. 다른 답변에서 더 자세한 설명 제공합니다 .


그러나 NIST의 최근 권장 사항은 추가 비밀 “소금” 의 사용을 권장합니다 (다른 사람들이이 추가 비밀 “후추”라고 부르는 것을 보았습니다). 이 비밀을 솔트로 사용하여 키 파생의 추가 반복을 수행 할 수 있습니다. 이 라운드는 미리 계산 된 조회 공격에 대한 강도를 높이기보다는 좋은 키 파생 함수에서 많은 반복 횟수와 마찬가지로 암호 추측으로부터 보호합니다. 이 비밀은 해시 된 암호와 함께 저장되면 아무 용도가 없습니다. 비밀로 관리해야하며 대규모 사용자 데이터베이스에서는 어려울 수 있습니다.


답변

“소금”에 대한 나의 이해는 크래킹을 더 어렵게하지만 여분의 데이터를 숨기려고하지 않는다는 것입니다. 솔트를 “비밀”로 만들어 더 많은 보안을 얻으려는 경우 암호화 키에 더 많은 비트가 필요합니다.


답변

두 번째 방법은 약간 더 안전합니다. 솔트는 사전 공격과 레인보우 테이블 공격으로부터 사용자를 보호합니다. 야심 찬 공격자가 전체 시스템을 손상시키는 것을 어렵게 만들지 만 여전히 시스템의 한 사용자에게 초점을 맞춘 공격에 취약합니다. 전화 번호와 같이 공개적으로 사용 가능한 정보를 사용 하고 공격자가이 사실을 알게되는 경우 된다면 공격의 단계를 저장 한 것입니다. 물론 문제는 공격자가 전체 데이터베이스, 솔트 등을 얻는다면 의문의 여지가 있습니다.

편집 : 이 답변과 일부 의견을 다시 읽은 후 질문에 제시된 두 가지 매우 구체적인 경우 만 비교하고 있다는 사실로 인해 혼란이 발생할 수 있습니다. 무작위가 아닌 소금. 전화 번호를 솔트로 사용하는 문제는 공격자가 전체 데이터베이스를 가져 오면 논쟁의 여지가 있으며 솔트 사용에 대한 질문이 아닙니다 .


답변

… 사용자 이름이나 전화 번호와 같은 것입니다. …

내 질문은 두 번째 접근 방식이 정말로 필요한지 여부입니다. 순전히 이론적 관점에서 첫 번째 접근 방식보다 더 안전하다는 것을 이해할 수 있지만 실용성 관점에서는 어떨까요?

실용적인 관점에서 솔트는 구현 세부 사항입니다. 정확한 예를 사용하기 위해 사용자 정보가 수집되거나 유지되는 방식을 변경하고 사용자 이름과 전화 번호가 때때로 변경되는 경우 보안이 손상되었을 수 있습니다. 이러한 외부를 향한 변경이 훨씬 더 깊은 보안 문제를 갖기를 원하십니까?

각 계정에 전화 번호가 있어야한다는 요구 사항을 중지하려면 해당 계정이 보안 침해에 노출되지 않았는지 확인하기 위해 완전한 보안 검토가 필요합니까?


답변

숨겨진 소금은 더 이상 소금이 아닙니다. 후추입니다. 그것의 용도가 있습니다. 소금과는 다릅니다.

Pepper는 해시를 HMAC (Hash Based Message Authentication Code)로 만드는 비밀번호 + 솔트에 추가 된 비밀 키입니다. 해시 출력 및 솔트에 액세스 할 수있는 해커는 이론적으로 해시를 생성 할 입력을 무차별 대입하여 추측 할 수 있습니다 (따라서 암호 텍스트 상자에서 유효성 검사를 통과 함). 후추를 추가하면 암호 학적으로 무작위로 문제 공간을 늘려 심각한 하드웨어 없이는 문제를 처리하기 어렵게 만듭니다.

고추에 대한 자세한 내용은 여기 에서 확인 하세요. .

hmac 도 참조하십시오 .


답변

다음은 각 해시에 대해 동일한 솔트를 사용하는 것이 왜 나쁜지 보여주는 간단한 예입니다.

다음 표를 고려하십시오.

UserId  UserName,   Password
     1  Fred       Hash1 =  Sha(Salt1+Password1)
     2  Ted        Hash2 =  Sha(Salt2+Password2)

Salt 1이 salt2와 같은
경우 1 Hash2가 Hash1 로 바뀌면 사용자 2는 사용자 1 암호로 로그온 할 수 있습니다.

솔트 1이 동일한 솔트 2가 아닌 경우 2
Hash2가 Hash1로 바뀌면 user2는 사용자 1 암호로 로그온 할 수 없습니다.