솔트 해시 값은 어디에서 오는가?


12

일반 텍스트로 저장할 수없는 암호와 같은 해시 값에 솔트 값을 추가 할 때 솔트 값을 얻는 가장 좋은 방법은 무엇입니까? 문맥 상, 이것이 웹 페이지 로그인의 암호를위한 것이라고 가정 해 봅시다.


@DevArt, 나는 매우 주관적인 답변이 필요하기 때문에 여기에 더 적합하다고 생각했습니다. 소금 값을 어디에서나 가져올 수 있으므로 "고객이나 서버에서 소금 값을 가져 오는 가장 안전한 위치는 어디라고 생각하십니까?"
Morgan Herlocker

답변:


7

일반적으로 created TIMESTAMP사용자 테이블에 열 이 있으므로 사용자가 언제 등록했는지 확인할 수 있습니다. Salt에 추가 열을 추가하고 싶지 않으므로 timestamp 열을 salt로 사용합니다.

SHA1(password + created)

그런 다음 사용자가 다시 로그인 할 때 확인을 위해 다시 해시 할 때 사용자 이름을 기반으로 날짜를 가져 오는 것으로 가정합니다.
Morgan Herlocker

1
@ 교수 : 예, 소금에 대한 특정 열이있는 경우와 같은 방식으로 그 관점에서 차이가 없습니다.
Jonas

7

그게 그렇게 중요한 건가?

소금은 두 가지 목적으로 사용됩니다. 사전 해시 된 암호의 큰 테이블 ( "무지개 테이블")을 사용하는 것은 실용적이지 않으며 해시 목록에서 동일한 암호를 다르게 보이게합니다. 동일한 비밀번호를 다르게 보이게하면 여러 사람이 하나의 특정 비밀번호 (일반적으로 약한 비밀번호)를 사용하는 문제를 피하는 데 도움이됩니다.

따라서 각 계정에는 고유 한 소금이 있어야하며 소금이 발생할 가능성이 높다는 의미에서 소금을 지나치게 예측할 수 없어야합니다. (많은 사이트가 1에서 시작하여 카운트 업을하면 나쁜 녀석은 예를 들어 소금이 적은 소금을 포함한 무지개 테이블을 만들 수 있습니다.) 일반적으로 예측할 수있는 것 이외의 의미로 무작위 일 필요는 없습니다. 그것들은 해시 그 자체보다 더 비밀이 아니기 때문에 명확하게 추측 할 필요가 없습니다.

소금을 생성하는 편리한 방법을 사용하십시오. 계정 수와 비교하여 잠재적 인 염가 값이 많으면 (유닉스 시스템에서 가능한 많은 수의 65536에 대해 2 바이트를 자주 사용 했음) 세미 임의 할당은 거의 중복 소금을 제공하지 않습니다.


1
필자는 일반적으로 사용자 이름, 솔트 및 비밀번호를 연결하고 전체 문자열을 해시하여 동일한 비밀번호가 다르게 보이는 두 번째 문제를 보았습니다. 따라서 계정 당 고유 한 소금을 생성 할 필요가 없습니다.
저스틴 케이브

1
@ 저스틴 : 흥미 롭습니다. 사용자 이름이 해시의 일부로 사용되는 것을 본 적이 없지만 실제로 엔트로피를 추가하는 좋은 방법입니다. 그래도 의사 난수 소금을 사용하는데, 그 이유는 소금을 생성하는 데 많은 비용이 들지 않기 때문입니다.
Matthieu M.

2
@Matthieu 어딘가에 저장해야한다는 단점이 있고, 거래의 양쪽에 필요하면 전송해야합니다. 사용자 이름으로 양쪽 모두 이미 알고 있습니다.
Matthew Frederick

2
@Justin :이 경우 사용자 이름을 소금으로 사용합니다. 레인보우 테이블을 실용적이지 않게 만들고 비슷한 암호를 다르게 보이게 만드는 소금의 두 가지 목적에 모두 답합니다.
David Thornley 2012

@David-사실, 소금의 일부가되는 사용자 이름으로 볼 수 있습니다. 공격자가 레인보우 테이블을 사용하여 사용자 이름 / 암호 조합을 찾을 수 없도록 여전히 추가 소금을 원합니다. 명백한 소금이 없으면 사용자가 레인보우 테이블에서 공격자에게 필요한 문자열의 크기를 사용자 이름의 길이만큼 늘리는 것입니다 (짧고 완전히 소문자이거나 완전히 대문자 일 수 있음). 공격자가 사이트 별 레인보우 테이블을 생성 할만큼 충분히 크지 않은 한 일정한 소금 만 있으면 레인보우 테이블 공격을 막을 수 있습니다.
저스틴 동굴

3

새 비밀번호 (등록, 비밀번호 재설정, 비밀번호 업데이트)를 저장할 때마다 한 가지 좋은 기술은 다음과 같습니다.

  • 새로운 소금을 생성
    • 암호로 안전한 의사 난수 생성기를 사용하십시오
    • 알맞은 크기의 소금을 사용하십시오-좋은 값은 기본 해시 알고리즘의 블록 크기입니다 (SHA-256 일 수 있음)
  • 새로운 비밀번호 토큰을 생성
    • 솔트를 hmac 키로 사용하여 기본 해시 알고리즘 (SHA-256 일 수 있음)에서 hmac 함수를 만듭니다.
    • for i in (0...65536) { password = hmac(password) }
    • hmac 함수의 반복 애플리케이션의 결과는 비밀번호 토큰입니다.
  • 소금과 암호 토큰을 저장하십시오
    • 원래 비밀번호를 저장하지 마십시오
    • 선택적으로 기본 해시 알고리즘 및 검색 가능성을위한 스트레치를 저장

1

프레임 워크를 활용하십시오. .NET에서는 RNGCryptoServoiceProvider를 사용할 수 있습니다 ...

        // If salt is not specified, generate it on the fly.
        if (saltBytes == null)
        {
            // Define min and max salt sizes.
            int minSaltSize = 4;
            int maxSaltSize = 8;

            // Generate a random number for the size of the salt.
            Random  random = new Random();
            int saltSize = random.Next(minSaltSize, maxSaltSize);

            // Allocate a byte array, which will hold the salt.
            saltBytes = new byte[saltSize];

            // Initialize a random number generator.
            RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

            // Fill the salt with cryptographically strong byte values.
            rng.GetNonZeroBytes(saltBytes); 
        }

다른 프레임 워크에는 활용할 수있는 비슷한 클래스가 있어야합니다. 임의성을 달성하기 위해 소프트웨어는 종종 Random위에서 언급 한 것처럼 사용자를 사용합니다 . 솔트를 제공하기 위해 정의 된 영역 내에서 마우스를 무작위로 이동하는 것은 TrueCrypt에서 사용하는 옵션입니다. 특정 요구 사항과 보안 수준으로 요약됩니다. 당신의 소금은 단순히 될 수 있기 때문에 !@#$%.


1

솔트 서버 측을 생성하여 생성시 사용자 계정에 할당합니다. 프레임 워크에서 사용 가능한 일부 암호화 생성 API를 더 잘 사용하지만 원칙적으로 모든 시퀀스가 ​​수행됩니다.

일반적으로 다음과 같이 저장됩니다.

User
-------------------
ID
Username
PasswordHashWithSalt

예:

PasswordHashWithSalt =

A15CD9652D4F4A3FB61A2A422AEAFDF0DEA4E703 j5d58k4b56s8744q


그래도 무엇을 기준으로 할당합니까? 사용자가 생성 후 다시 로그인 할 때 복제 될 수 있도록 남아있는 값에서 가져 오지 않아도됩니까?
Morgan Herlocker

"할당"이란 사용자 이름 / 암호 쌍 (계정) 당 소금을 생성하여 데이터베이스에 저장한다는 의미입니다. 로그인을 수행해야 할 때 저장된 소금을 사용하여 확인하십시오.

1

bcrypt를 사용 하고이 기사 를 읽으면 일반 해시만으로는 오늘날과 같이 심각한 보호 기능이 아닙니다.

사용을 고려 SDR 대한 지식이 전혀없는 암호 프로토콜 오픈 소스 라이브러리의 많음을 가지고 있으며, 특허 무료입니다.

SDR에는 소금이 필요하며이를 얻기 위해서는 최고의 장소가 고객입니다. 키 입력, 마우스 이동, 환경 변수, 임의의 숫자, 임시 폴더의 파일 생성 시간 등을 계산하여 서버에서 예기치 않은 방식으로 최종 소금을 만듭니다. SDR은 가장 중요한 사용자 암호 인 salt를 가져와 검증 자 키를 생성합니다. 비밀번호는 저장하지 않으며 컴퓨터에서 나가지 않지만 검증기 키 및 솔트와 함께 제공되는 비밀번호가 있는지 확인할 수 있습니다. 그것은 중간 및 사전 공격에서 사람의 면역입니다. 데이터베이스 열에서 키와 솔트를 암호화하여 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.