password_hash
을 사용하지 말고 암호를 해시하는 대신 crypt()
을 sha512
과 함께 사용한다고 가정 해 보겠습니다. 암호에 소금을 추가해야하므로 공격자가 무지개 테이블 공격을 사용할 수 없습니다. 왜 소금은 이 좋은이어야하고 많은 SO 답변에 나와있는 것처럼 매우 무작위입니까? 소금이 조금씩 다르거 나별로 랜덤하지 않더라도 다른 사람들과 완전히 다른 해시를 제공합니다. 따라서 공격자는 누가 동일한 암호를 사용하는지 알지 못하며 무지개 테이블을 하나만 만들 수는 있습니다.왜 좋은 소금을 가지고 있습니까?
답변
강한 소금을 계산하고 저장하는 데는 최소한의 노력 만 있으면서도 천문학적으로 소금이 적게 들어있는 무지개 테이블이 사전에 계산 될 가능성이 줄어 듭니다.
소금이 3 자리 숫자 인 경우 공격자가 가능한 모든 염분 조합에 대해 무지개 표를 미리 계산할 수 있습니다. 소금이 임의의 24 자리 영숫자 문자열이면 공격자가 모든 가능한 염에 대해이 값을 미리 계산할 수있는 가능성은 거의 제로입니다.
소금은 고유해야하고, 충분히 길어야하며, 예측할 수 없어야합니다. 임의성은 필요하지 않지만 컴퓨터가 이러한 요구 사항을 충족시키는 가장 쉬운 방법입니다. 비밀의 목적은 소금의 목적이 아니며, 소금은 알려진 때에도 목적을 수행합니다.
고유성은 데이터베이스에서 고유해야 함 (그렇지 않으면 사용자 ID를 사용할 수 있음)을 의미하며, 전 세계적으로 고유해야합니다. 소금물에 무지개 표를 만들 수 있습니다. 1-1000을 사용하면 해당 사용자 ID로 모든 계정의 암호를 검색 할 수 있습니다 (종종 관리자 계정의 사용자 ID가 낮음).
충분히 짧음 : 소금이 너무 짧으면 (가능한 조합이 너무 적 으면) 무지개 표를 다시 만드는 것이 수익이됩니다. 소금과 암호를 함께 사용하면 더 긴 암호로 간주 될 수 있으며 더 긴 암호에 무지개 표를 작성할 수 있으면 더 짧은 원래 암호를 얻을 수 있습니다. 매우 강력하고 긴 패스워드의 경우, 실제로 소금물을 칠할 필요가 전혀 없지만, 사람이 생성 한 대부분의 암호는 짧기 때문에 (사람들이 기억해야한다) 무차별 적으로 강요 당할 수있다.
또한 다른 매개 변수에서 나온 소금을 사용하면이 범주에 속할 수 있습니다. 사용자 ID에서 해시를 계산할 때만 가능한 조합이 증가하지 않습니다.
예측 불가능 조금 덜 중요하지만 소금으로 사용자 ID를 사용하여 한 번 더 사건을 상상하고, 공격자는 다음 몇 사용자 ID가 될 것입니다 무엇을 찾을 수 있으므로 rainbow-의 좁은 수를 미리 계산 할 수 있습니다 테이블. 사용 된 해시 알고리즘에 따라 적용 가능하거나 불가능할 수 있습니다. 그는 그 때 시간 이점이 있고, 즉시 암호를 만회 할 수있다. 관리자 계정에서 예측 가능한 소금을 사용하면 더 많은 문제가 발생할 수 있습니다.
OS 무작위 소스 (dev/urandom)에서 생성 된 실제 임의의 숫자를 사용하면 수행 할 수있는 최상의 방법입니다. 위의 모든 이유를 무시하더라도 더 좋은 방법이있을 때 파생 된 소금을 사용해야하는 이유는 알고있는 최선의 방법을 사용하지 않는 이유는 무엇입니까?
좋은 무작위 소금 소금을 "추측하는 것"이 불가능해야합니다. – Rufinus
"좋음"으로 "무작위"라고 가정합니다.이 경우 [이 답변] (http://stackoverflow.com/a/1645190/139010)을 읽어야합니다. 구체적으로 "그럼 왜 소금이 있어야합니까? 무작위? " –
@Rufinus 그가 암호를 얻으면 그는 소금을 얻을 것입니다. –