나는 이것에 대해 약간 다른 테이크를 제공 할 것이다.
나는 항상 소금에 절인 암호 해시와 섞인 소금을 저장합니다.
예를 들어, 나는 소금의 첫 절반을 암호의 소금에 절인 해시 앞에 놓고 소금의 마지막 절반을 암호의 소금에 절인 해시 뒤에 놓습니다. 응용 프로그램은이 디자인을 알고 있으므로이 데이터를 가져 와서 소금과 소금에 절인 암호 해시를 얻을 수 있습니다.
이 접근법에 대한 나의 근거 :
암호 / 해시 데이터가 손상되어 공격자의 손에 들어가면 공격자는 데이터를 살펴보면 소금이 무엇인지 알 수 없습니다. 이런 식으로 공격자는 해시와 일치하는 암호를 얻기 위해 실제로 무차별 대입 공격을 수행 할 수 없습니다. 해시를 시작할지 모르고 데이터의 어떤 부분이 소금의 일부인지 알 수 없기 때문입니다. 솔트 된 비밀번호 해시의 일부 ( 응용 프로그램의 인증 로직을 모르는 경우 제외) ).
솔트 된 암호 해시가있는 그대로 저장되면, 솔트 및 해시 된 경우 솔트 된 암호 해시와 동일한 데이터를 생성하는 암호를 얻기 위해 무차별 대입 공격을 수행 할 수 있습니다.
그러나 예를 들어, 소금에 절인 암호 해시가있는 그대로 저장되었지만 단일 바이트로 미리 추가 된 경우에도 공격자가 첫 번째 바이트를 폐기해야한다는 사실을 모르면 어려움이 증가합니다. 공격의. 응용 프로그램은 사용자를 인증하는 데 사용될 때 데이터의 첫 바이트를 버리는 것을 알고 있습니다.
이것에 대한 결론 ..
1) 인증 응용 프로그램이 사용하는 데이터를 정확한 형식으로 저장하지 마십시오.
2) 가능하면 보안 강화를 위해 인증 논리를 비밀로 유지하십시오.
한 걸음 더 나아갑니다.
응용 프로그램의 인증 논리를 비밀로 유지할 수없는 경우 많은 사람들이 데이터가 데이터베이스에 저장되는 방식을 알고 있습니다. 그리고 소금과 함께 섞인 소금에 절인 해시를 저장하기로 결정했다고 가정 해 봅시다.
임의 소금을 생성 할 때, 소금에 절인 암호 해시 전후에 소금의 비율을 무작위로 결정할 수도 있습니다.
예를 들어 512 바이트의 임의 소금을 생성합니다. 비밀번호에 솔트를 추가하고 솔트 된 비밀번호의 SHA-512 해시를 얻습니다. 또한 임의의 정수 200을 생성합니다. 그런 다음 처음 200 바이트의 소금을 저장 한 다음 소금에 절인 암호 해시와 나머지 소금을 저장합니다.
사용자의 비밀번호 입력을 인증 할 때 응용 프로그램은 문자열을 통과하고 데이터의 첫 1 바이트는 솔트의 첫 1 바이트이고 솔트 해시가 뒤따른다고 가정합니다. 이 패스는 실패합니다. 응용 프로그램은 처음 2 바이트의 데이터를 솔트의 첫 2 바이트로 계속 사용하고 처음 200 바이트를 솔트의 첫 200 바이트로 사용한 후 긍정적 결과가 나올 때까지 반복합니다. 암호가 틀리면 응용 프로그램은 찾을 수 없을 때까지 모든 순열을 계속 시도합니다.
이 접근법의 장점 :
보안 강화-인증 로직을 알고 있더라도 컴파일시 정확한 로직을 알 수 없습니다. 정확한 논리에 대한 지식이 있어도 무차별 대입 공격을 수행하는 것은 사실상 불가능합니다. 소금의 길이가 길수록 안전성이 더 높아집니다.
이 접근법의 단점 :
정확한 로직은 런타임에 유추되므로이 방법은 CPU를 많이 사용합니다. 솔트의 길이가 길수록이 방법은 CPU를 많이 사용합니다.
잘못된 비밀번호를 인증하면 CPU 비용이 가장 많이 듭니다. 이는 합법적 인 요청에 비생산적 일 수 있지만 공격자에 대한 보안을 강화합니다.
이 방법은 다양한 방식으로 구현 될 수 있으며 가변 너비 솔트 및 / 또는 솔트 비밀번호 해시를 사용하여 더욱 안전하게 만들 수 있습니다.