업데이트 : 나는 소금이 무엇인지, 무지개 테이블이 무엇인지, 사전 공격이 무엇인지, 소금의 목적이 무엇인지 묻지 않습니다. 나는 질문하고 있습니다 : 사용자 솔트와 해시를 알고 있다면 암호를 계산하는 것이 쉽지 않습니까?
프로세스를 이해하고 일부 프로젝트에서 직접 구현합니다.
s = random salt
storedPassword = sha1(password + s)
데이터베이스에 다음을 저장합니다.
username | hashed_password | salt
내가 본 모든 솔팅 구현은 비밀번호의 끝 또는 시작 부분에 솔트를 추가합니다.
hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)
따라서 소금 (ha ha)의 가치가있는 해커의 사전 공격은 위에 나열된 일반적인 조합으로 저장된 소금에 대해 각 키워드를 실행합니다.
확실히 위에서 설명한 구현은 근본적인 문제를 실제로 해결하지 않고 단순히 해커에게 또 다른 단계를 추가합니까? 이 문제를 해결할 수있는 대안이 있습니까? 아니면 문제를 오해하고 있습니까?
내가 생각할 수있는 유일한 일은 솔트와 비밀번호를 임의의 패턴으로 묶거나 해싱 프로세스에 다른 사용자 필드를 추가하는 비밀 블렌딩 알고리즘을 사용하는 것입니다. 즉, 해커가 데이터베이스에 액세스하고 코드를 묶어야한다는 의미입니다. 사전 공격을 통해 유익한 것으로 입증되었습니다. (댓글에서 지적했듯이 해커가 모든 정보에 액세스 할 수 있다고 가정하는 것이 가장 좋으므로 이것이 최선이 아닐 수 있습니다).
해커가 암호 및 해시 목록을 사용하여 사용자 데이터베이스를 해킹하는 방법에 대한 예를 들어 보겠습니다.
해킹 된 데이터베이스의 데이터 :
RawPassword (not stored) | Hashed | Salt
--------------------------------------------------------
letmein WEFLS... WEFOJFOFO...
공통 암호 사전 :
Common Password
--------------
letmein
12345
...
각 사용자 레코드에 대해 공통 암호를 반복하고 해시합니다.
for each user in hacked_DB
salt = users_salt
hashed_pw = users_hashed_password
for each common_password
testhash = sha1(common_password + salt)
if testhash = hashed_pw then
//Match! Users password = common_password
//Lets visit the webpage and login now.
end if
next
next
이것이 내 요점을 훨씬 더 잘 보여주기를 바랍니다.
10,000 개의 공통 암호와 10,000 개의 사용자 레코드가 주어지면 가능한 많은 사용자 암호를 찾으려면 100,000,000 개의 해시를 계산해야합니다. 몇 시간이 걸릴 수 있지만 실제로는 문제가되지 않습니다.
크래킹 이론 업데이트
우리는 SHA1 해시와 솔트의 데이터베이스에 액세스 할 수있는 손상된 웹 호스트이며이를 혼합하는 알고리즘과 함께 있다고 가정합니다. 데이터베이스에는 10,000 개의 사용자 레코드가 있습니다.
이 사이트 는 GPU를 사용하여 초당 2,300,000,000 SHA1 해시를 계산할 수 있다고 주장합니다. (실제 상황에서는 아마도 더 느리 겠지만 지금은 인용 된 수치를 사용할 것입니다).
(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 초
최대 길이가 4 자이고 계산 속도 (변수)로 나눈 값으로 나눈 95 개의 인쇄 가능한 ASCII 문자의 전체 범위가 10,000에 대해 2로 나눈 값 (암호 검색에 걸리는 평균 시간이 평균 순열의 50 %를 필요로한다고 가정) 사용자는 길이가 4 미만인 모든 사용자 암호를 계산하는 데 177 초가 걸립니다.
사실감을 위해 약간 조정 해 봅시다.
(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 일
대소 문자를 구분하지 않고 암호 길이가 7 미만이고 영숫자 문자로만 가정하면 10,000 개의 사용자 레코드를 해결하는 데 4 일이 걸리며 오버 헤드와 비 이상적인 상황을 반영하기 위해 알고리즘 속도를 절반으로 줄였습니다.
이것은 선형적인 무차별 대입 공격이며 모든 계산은 서로 독립적이므로 여러 시스템에서 해결해야 할 완벽한 작업이라는 것을 인식하는 것이 중요합니다. (예외 시간의 절반이되는 서로 다른 끝에서 공격을 실행하는 2 대의 컴퓨터를 쉽게 설정할 수있는 IE).
이 작업을 계산적으로 더 비싸게 만들기 위해 암호를 1,000 번 재귀 적으로 해싱하는 경우를 고려합니다.
(((36 ^ 7) / 1000000000000) / 2) * 1000 초 = 10.8839117 시간
이는 한 명의 사용자에 대해 인용 된 숫자에서 절반 미만의 속도로 실행되는 최대 7 개의 영숫자 문자를 나타냅니다 .
재귀 적으로 1,000 회 해싱하면 포괄적 인 공격을 효과적으로 차단하지만 사용자 데이터에 대한 표적 공격은 여전히 취약합니다.