문제

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

내 질문은 두 번째 접근 방식이 정말로 필요한 경우입니까? 나는 순전히 이론적 인 관점에서 그것이 첫 번째 접근법보다 더 안전하다는 것을 이해할 수 있지만, 실용성 관점에서 어떻게해야합니까? 지금 사용자를 인증하려면 소금을 암호화하지 않고 로그인 정보에 적용해야합니다.

그것에 대해 생각한 후, 나는이 접근법에서 실제 보안 이익을 보지 못합니다. 소금을 계정에서 계정으로 바꾸면 공격자가 각 계정에 대해 어떤 것이 무엇인지 빠르게 결정하는 방법을 알고 있더라도 누군가가 해시 알고리즘을 무차별하려고 시도하는 것이 여전히 어려워집니다. 이것은 암호가 충분히 강하다는 가정에 중점을두고 있습니다. (두 자리 숫자 인 암호 세트에 대한 올바른 해시를 찾는 것이 8 자리 인 정확한 암호 해시를 찾는 것보다 훨씬 쉽습니다). 내 논리가 잘못 되었습니까, 아니면 내가 놓친 것이 있습니까?

편집하다: 좋아, 여기에 소금을 암호화하는 것이 정말 무리라고 생각하는 이유가 있습니다. (lemme 내가 올바른 길을 가고 있는지 알고 있습니다).

다음 설명을 위해, 암호는 항상 8 자이고 소금은 5이고 모든 암호는 소문자로 구성되어 있다고 가정합니다 (수학을 더 쉽게 만듭니다).

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

그래서 소금을 암호화합니다. 소금이 암호화되어 있다는 것을 알고 있다면, 나는 먼저 암호화가 충분하다고 가정 할 때 해독하지 않을 것입니다. 나는 그것을 무시할 것이다. 이를 해독하는 방법을 알아내는 대신 이전 예제로 돌아가서 13^26의 모든 키를 포함하는 더 큰 무지개 테이블 만 생성합니다. 소금을 알지 못하면 분명히 나를 느리게 할 것이지만, 나는 그것이 소금 암호화를 먼저 깨기 위해 노력하는 기념비적 인 작업을 추가 할 것이라고 생각하지 않습니다. 그것이 내가 그만한 가치가 있다고 생각하지 않는 이유입니다. 생각?

다음은 Brute Force Attack에서 암호가 얼마나 오래 유지 될지를 설명하는 링크입니다.http://www.lockdown.co.uk/?pg=combi

도움이 되었습니까?

해결책

여기서 대답은 당신이 실제로 무엇을 보호하려고하는지 스스로에게 물어 보는 것입니다. 누군가가 데이터베이스에 액세스 할 수 있다면 암호화 된 소금에 액세스 할 수 있으며 코드에도 액세스 할 수 있습니다. 그들이 암호화 된 소금을 해독 할 수있는 모든 것을 가지고 있습니까? 그렇다면 암호화는 어쨌든 거의 쓸모가 없습니다. 소금은 실제로 그것을 만들기 위해 거기에있게되므로 무지개 테이블을 형성하여 전체 비밀번호 데이터베이스가 부러지면 한 번에 갈라진 곳에 갈라질 수 없습니다. 그 관점에서, 각 소금이 독특하다면 차이가 없다면, 소금이나 각 암호에 대한 암호화 된 소금에 대한 무차별 인력 공격이 필요합니다.

다른 팁

소금을 숨기는 것은 불필요합니다.

모든 해시마다 다른 소금을 사용해야합니다. 실제로 이것은 암호화 품질 랜덤 번호 생성기에서 8 개 이상의 바이트를 얻음으로써 쉽게 달성하기 쉽습니다.

a 내 이전의 대답:

소금은 사전 계산 사전 공격을 방해하는 데 도움이됩니다.

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

그러나 그의 다음 목표가 그들의 비밀번호를 소금에 올렸다고 가정 해 봅시다. 공격자가 소금이 무엇인지 알고 있더라도 그의 미리 계산 된 테이블은 무가치합니다. 소금은 각 암호로 인해 해시를 변경합니다. 그는 목록에있는 모든 암호를 다시 말해야하며 대상의 소금을 입력에 부착해야합니다. 모든 소금에는 다른 소금이 다른 사전이 필요하며, 충분한 소금이 사용되면 공격자는 사전을 모두 저장할 공간이 없습니다. 시간을 절약하기위한 공간은 더 이상 옵션이 아닙니다. 공격자는 공격하려는 각 대상에 대해 각 비밀번호를 목록에 해싱해야합니다.

따라서 소금을 비밀로 유지할 필요는 없습니다. 공격자가 특정 소금에 해당하는 사전 계산 사전이 없도록하기에 충분합니다.


이것에 대해 조금 더 생각한 후, 나는 소금이 숨겨 질 수 있다고 생각하는 것이 위험하다는 것을 깨달았습니다. 소금을 숨길 수 없다고 가정하고 그에도 불구하고 시스템을 안전하게 설계하는 것이 훨씬 낫습니다. 더 자세한 설명을 제공합니다 또 다른 대답으로.

"소금"에 대한 나의 이해는 균열이 더 어려워 지지만 추가 데이터를 숨기려고 시도하지 않는다는 것입니다. 소금을 "비밀"으로 만들어 더 많은 보안을 얻으려고한다면 암호화 키에 더 많은 비트를 원합니다.

두 번째 접근법은 약간 더 안전합니다. SALT는 사전 공격 및 무지개 테이블 공격으로부터 사용자를 보호합니다. 그들은 야심 찬 공격자가 전체 시스템을 손상시키기가 더 어려워 지지만 여전히 시스템의 한 사용자에게 초점을 맞춘 공격에 여전히 취약합니다. 전화 번호와 같이 공개적으로 제공되는 정보를 사용하는 경우 그리고 공격자는 이것을 알게됩니다, 당신은 그들에게 그들의 공격의 한 걸음을 저장했습니다. 물론 공격자가 전체 데이터베이스, 소금 및 모든 것을 얻는다면 문제는 무의미합니다.

편집하다: 이 답변과 의견 중 일부를 다시 읽은 후, 혼란의 일부는 질문에 제시된 두 가지 매우 구체적인 사례를 비교하고 있다는 사실에 기인 한 것이 나에게 발생합니다. 임의의 소금. 의문 전화 번호를 소금으로 사용합니다 공격자가 전체 데이터베이스를 받으면 ~ 아니다 소금을 전혀 사용하는 문제.

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

Pepper는 암호 + 소금에 추가 된 비밀 키로 해시를 HMAC (해시 기반 메시지 인증 코드)로 만듭니다. 해시 출력에 액세스 할 수있는 해커와 소금은 이론적으로 무차별 인 힘이 해시를 생성하는 입력을 추측 할 수 있습니다 (따라서 암호 텍스트 상자에서 유효성 검사를 전달). Pepper를 추가하면 암호적으로 임의의 방식으로 문제 공간을 증가시켜 심각한 하드웨어없이 문제를 다루기 쉽게 만듭니다.

Pepper에 대한 자세한 내용은 확인하십시오 여기.

또한보십시오 HMAC.

다음은 각 해시에 대해 같은 소금을 갖는 것이 나쁜 이유를 보여주는 간단한 예입니다.

다음 표를 고려하십시오

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

소금 1이 salt2와 동일 할 경우 사례 1 HASH2가 HASH1로 교체되면 사용자 2는 사용자 1 비밀번호로 로그온 할 수 있습니다.

사례 2 소금 1이 같은 소금이 아닐 때 2 HASH2가 HASH1로 교체되면 User2는 사용자 1 비밀번호로 로그온 할 수 없습니다.

... 해시를 소금하는 사용자 이름이나 전화 번호와 같은 것. ...

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

실용적인 관점에서, 소금은 구현 세부 사항입니다. 사용자 정보가 수집 또는 유지 관리되는 방식과 사용자 이름과 전화 번호가 모두 변경되어 때때로 정확한 예제를 사용하려면 보안을 손상시킬 수 있습니다. 그러한 외부를 향한 변화가 훨씬 더 깊은 보안 문제를 갖기를 원하십니까?

각 계정에 전화 번호가 있어야한다는 요구 사항이 완전한 보안 검토를 포함하여 해당 계정을 보안 타협으로 열지 않았는지 확인해야합니까?

목표를 가진 두 가지 기술이 있습니다.

  • "소금"은 다른 두 가지 동일한 암호를 다르게 암호화하는 데 사용됩니다. 이런 식으로 침입자는 암호화 된 암호의 전체 목록에 대한 사전 공격을 효율적으로 사용할 수 없습니다.

  • (공유) "비밀"은 메시지를 해시하기 전에 추가되므로 침입자가 자신의 메시지를 만들 수없고 받아 들일 수 없습니다.

나는 소금을 숨기는 경향이있다. 해시 전에 1에서 1024로 임의의 숫자를 선제하여 10 비트의 소금을 사용합니다. 비밀번호를 비교할 때 사용자는 해시와 함께 입력 한 I, 1에서 1024로 고리하고 일치를 찾을 때까지 가능한 모든 소금 값을 시도합니다. 1/10 초 미만이 걸립니다. 나는 PHP에서 이런 식으로 할 아이디어를 얻었다 password_hash 그리고 password_verify. 내 예에서 "비용"은 10 비트의 소금에서 10입니다. 또는 다른 사용자가 말한 바에 따르면 숨겨진 "소금"을 "Pepper"라고합니다. 소금은 데이터베이스에서 암호화되지 않습니다. 그것은 무차별입니다. 해시를 1000 배 더 크게 역전시키는 데 무지개 테이블이 필요합니다. SHA256은 빠르지 만 여전히 안전한 것으로 간주되기 때문에 사용합니다.

실제로 데이터를 보호하려는 공격 유형에 따라 다릅니다.

각 암호에 대한 고유 한 소금의 목적은 전체 암호 데이터베이스에 대한 사전 공격을 방지하는 것입니다.

각 비밀번호에 대해 고유 한 소금을 암호화하면 개별 비밀번호를 깨는 것이 더 어려워 지지만 실제로 많은 혜택이 있는지 무게를 측정해야합니다. 공격자가 Brute Force에 의해이 끈을 찾는 경우 :

Marianne2ae85fb5d

DB에 저장된 해시 해시, 어떤 부분이 패스인지, 어떤 부분이 소금인지 알아 내기가 어렵습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top