2014-06-12 2 views
7

sha512-crypt 해시 이해에 대한 질문이 있습니다. 나는이 tutorial에 dovecot과 postfix를 mysql으로 설정하는 것을 발견했다. 나는 튜토리얼 (약간의 수정)을 따라 모든 것이 잘 동작한다. 그러나 한 가지 내가 이해하지 못하는 것이있다 :sha512-crypt mysql 및 dovecot

사용자를 추가하려면, 내가 사용한다 :

INSERT INTO `mailserver`.`virtual_users` 
    (`id`, `domain_id`, `password` , `email`) 
VALUES 
    ('1', '1', ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'), 
    ('2', '1', ENCRYPT('secondpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), '[email protected]'); 

다시를이 완벽하게 잘 작동, 즉 내 비밀번호를 사용하여 로그인 (수 내 비밀번호 만)을 dovecot에 추가하십시오. 하지만 왜? 내가 올바르게 보았다면 암호를 임의의 소금으로 암호화하지만 어디에도 저장하지 않습니다. 그래서 동일한 암호를 두 번 해싱하면 2 개의 다른 해시를 얻을 수 있습니다 (시도했습니다). 그래서 내 질문은 다음과 같습니다. sha-512 (온라인에서 찾을 수없는)에 대한 간략한 설명과이 라인이 작동하는 이유에 대한 설명을 얻을 수 있습니까?

감사합니다. 이미

+0

우연히 데이터베이스와 암호/사용자가 일치하는 쿼리를 찾았습니까? –

+0

네, 그게 다음과 같습니다 :'password_query = 비밀 번호를 선택하십시오 어디 사용자 이름 = '% u'' – ciem

답변

10

소금은 암호의 일부로 저장됩니다. 호출 예를 들어 :

ENCRYPT('firstpassword', CONCAT('$6$', 'FooBarBaz')) 

$ (6) $ FooBarBaz $ .T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwgvPOOoccrr0bvkBbNMmLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe를 제공합니다.

사용 된 알고리즘 (6은 SHA512 임)과 소금 ('FooBarBaz')은 모두 $으로 구분됩니다.

편집 :

password = ENCRYPT('user_input', `password`) 

ENCRYPT이 저장된 암호와 소금을 잡고 user_input을 확인할 때 사용합니다 : 당신이 사용할 수있는 암호를 확인합니다.

비밀번호 확인을 위해 hek2mgl에 대한 전체 크레딧은 this answer입니다.

+0

고마워, 그게 전부 야. mysql은 패스워드를 데이타베이스에 저장된 문자열과 비교하는 쉬운 방법이 있습니까? 나는. 나는'$ 6 $ FooBarBaz $ .T.G.7FRJqZ6N2FF7b3BEkr5j37CWhwvvPOOoccrr0bvkBbMMLCxzqQqKJbNhnhC.583dTBLEuZcDuQe7NEe'와 그 값을 true 또는 false를 반환하는 인수로 비교할 수있는 함수를 제공 할 수있는 함수를 제공합니까? – ciem

+0

@ciem ENCRYPT를 사용할 수 있습니다. 예를 들어 편집 해 보겠습니다. – Jim

+0

자세한 답변을 주셔서 감사합니다 – ciem