저는 암호화 초보자이며 암호화가 무엇인지 매우 간단한 용어로 이해하려고합니다. " salt " 는 사용해야 할 때와 사용해야하는 이유와 사용하지 말아야하는 이유입니다.
매우 간단하게 그리고 명확한 (초급 수준) 설명?
주제에 대한 참조를 알고 있다면 이것도 유용 할 것입니다.
답변
솔트가 사용되는 이유는 사람들이 동일한 비밀번호를 선택하는 경향이 있고 무작위로 선택하는 경향이 없기 때문입니다. 많은 사용 된 비밀번호는 기억하기 쉽도록 짧은 실제 단어가 있습니다. 아시다시피 암호는 일반적으로 일반 텍스트로 저장되지 않고 해시 처리됩니다. 해시 기능의 목적이 확실하지 않은 경우 먼저 해당 내용을 읽어보십시오.
이제 공격자가 할 수있는 일은 단순히 공통 암호와 해당 해시 목록을 생성하는 것입니다. 일반 비밀번호를 사용하는 경우 사이트가 테이블과 함께 저장 한 해시를 사용하면 공격자에게 비밀번호가 노출됩니다.
A salt 는 사용자를위한 암호 해시 출력을 고유하게 에 추가하기 만하면됩니다. 일반적인 비밀번호 채택 . 그 목적은 사전 계산 기반 공격을 유용하지 않게 만드는 것입니다. 비밀번호가 고유 한 솔트와 함께 저장된 경우 무염 비밀번호 해시를 대상으로하거나 다른 솔트를 사용하는 계정을 대상으로하는 사전 계산 된 비밀번호 해시 테이블은 계정의 비밀번호를 크래킹하는 데 도움이되지 않습니다. 무작위로 생성 된 솔트 (/dev/urandom
)는 전 세계적으로 고유 한 일 것으로 예상됩니다. 따라서 소금을 사용하여 -계산 공격은 전혀 효과가 없습니다.
솔트와 비밀번호를 결합하는 가장 간단한 방법은 단순히 연결하는 것입니다. 즉, 저장된 해시 값은 Hash(salt||password)
입니다. 비밀번호 password1
는 이제 마술처럼 암호 크래커의 표에서 찾을 수없는 6$dK,3gCA%Jpassword1
가됩니다.
솔트는 데이터베이스의 해시 된 값 옆에있는 일반 상태로 완전히 저장할 수 있습니다. 공격자가 데이터베이스를 확보하고 암호를 찾으려고하면 각 솔트에 대해 미리 계산 된 테이블을 개별적으로 생성해야합니다. 비용이 많이 드는 작업입니다.
오프라인 암호 크래킹을 방지하는 또 다른 방법은 수행하는 것입니다. 암호 스트레칭, 즉. 로그인 서비스 및 암호 크래커를 포함하여 모든 사람에 대해 암호 해시 계산 속도가 느려집니다. 암호를 늘리는 데 사용되는 한 가지 방법은 해시 함수를 여러 번 반복하는 것입니다 (예 : Hash(Hash(Hash(Hash…(Hash(salt||password)))…)
저장).
솔팅과 관련된 또 다른 일반적인 아이디어는 페퍼 입니다. 즉, 저장된 값이 Hash(pepper||salt||password)
가되도록 암호에 연결된 또 다른 임의 값입니다. 그러면 후추가 아무것도 저장되지 않습니다 . 로그인 서버와 비밀번호 크래커 모두 알려지지 않은 후추 값을 무차별 대입해야하므로 양 당사자의 비밀번호 해시 비교 속도가 느려집니다.
2013 년부터 2015 년까지 비밀번호 해싱 더 나은 암호 확장 알고리즘을 찾기 위해 경쟁 이 열렸습니다. 우승자는 Argon2 알고리즘입니다. 프로그래머는 자체 알고리즘을 구현하는 대신 Argon2 를 사용하는 것이 좋습니다.
댓글
- 기본적으로 데이터베이스에 하나 또는 두 개의 암호 만 저장되어있는 경우 솔트 사용이 사실상 무용지물입니까? 내가 이해하는 것은 이것이 데이터베이스에 저장된 암호 수가 적지 않은 경우에만 도움이된다는 것입니다.
- @AbhinavChoudhury : 아니요, 레인보우 테이블 (예 : 특정 해시에 대해 미리 계산 된 테이블)을 방어합니다. 예 : 비밀번호 " password1 "를 가져옵니다. 솔트하지 않으면 ' ' HASH (" password1 "). 이제 공격자가 기록을 얻고 모든 9 자 암호에 대해 HASH (*)를 미리 계산 한 경우 암호를 복구 할 수 있습니다. 대신 암호를 솔트 한 경우 HASH (' somesaltforyou ' || ' password1 ')는 공격자 레인보우 테이블에 포함되지 않습니다 ('가 9자를 초과하므로).
- " 솔트는 데이터베이스의 해시 된 값 옆에있는 일반 상태로 완전히 저장할 수 있습니다. "- -이 부분은 나에게 전혀 의미가 없습니다. 확장 할 수 있는지 궁금합니다.
- 솔트의 요점은 미리 계산 된 테이블에서 해시를 찾을 수 없는지 확인하는 것입니다. 암호를 확인하기 위해 저장해야합니다 (그렇지 않으면 ' sa " pepper "). 솔트는 " 비밀 "이 아니라 고유 한 비밀번호를 만들기 위해서만 사용됩니다. 이것은 물론 저장된 모든 비밀번호에는 고유 한 (그리고 임의의) 솔트가 있어야합니다.
답변
암호화“소금”이 무엇인지 이해하도록 도와 주시겠습니까?
비밀번호와 관련하여 생성에서 “솔트”는 암호의 해시 된 출력을 해독하기 어렵게 만들기 위해 해시 함수에 추가 된 데이터 (임의 또는 기타)입니다.
언제 사용해야하나요?
항상
이유 사용해야합니까, 아니면 사용하지 않아야합니까?
아래에 설명 된 이유로 항상 해시 함수에 솔트 값을 사용해야합니다.
일반적으로 사람들이 취약한 비밀번호를 선택하는 것은 사실이며,이를 나타내는 해시 값으로 가득 찬 기가 바이트의 공개적으로 사용 가능한 레인보우 테이블 이 있다는 것은 확실히 사실입니다. 따라서 누군가가 귀하의 서비스에 계정을 생성하고 자신의 신원을 보호하기 위해 비밀번호를 선택할 때 일반적으로 선택한 비밀번호는 1) 공통, 2) 안전하지 않으며 3) 조회 테이블에서 상호 참조 할 수 있습니다.
예를 들어 MD5를 통해 해시 된 비밀번호 Nowayin1 는 6f367d65bc74b88e21fb9959487ffa3a 분명히 좋은 선택이 아닙니다. 괜찮아 보이지만 그렇지 않은 경우에도 암호의 MD5 해시가 열린 데이터베이스에 표시된다는 사실은 쓸모가 없게 만듭니다.
하지만 이는 128 비트 MD5에 불과합니다. SHA1 (160 비트) 또는 Whirlpool (512 비트)처럼 더 강합니까?
동일한 문제입니다.
예 : SHA1이있는 P @ $$ word 는 1e69e0a615e8cb813812ca797d75d4f08bdc2f56 및 1qazXSW @ 는 0bf7545b784665d23b9c174ca03688a405f05b048e9d6c49b7c2776df3d6c49b7c2c2721a1f6f6c49b6708ee1dfee3d5ec56e7c2721a1d3d3d3d3d6e7c2721a1f3d3d0b >.
이러한 모든 비밀번호의 근본 문제는 일반적으로 사용되는 해시가 일반 지식이되었다는 사실입니다.
salt 변경됩니다.
사용자가 선택한 비밀번호에 임의의 값 (솔트)이 추가 된 경우 그러면 SHA1 해시 1e69e0a615e8cb813812ca797d75d4f08bdc2f56 가 더 이상 P @ $$ word를 표시하지 않습니다. 레인보우 테이블의 해시 값이 더 이상 일치하지 않기 때문에 사용자의 암호로 사용됩니다.
그리고 많은 시간이 걸리지 않습니다. 예를 들어 작은 16 비트 임의 값은 조회 테이블에서 각 해시 값의 65,536 개의 변형을 생성합니다. 따라서 150 억 개의 항목으로 구성된 데이터베이스는 이제 소금을 설명하기 위해 9,300 억 개가 넘는 해시가 필요합니다.
그게 바로 조회 및 레인보우 테이블을 방해하기 위해 해시를 소금으로 처리하는 요점입니다. “해커가 암호를 알아 내기 위해 레인보우 테이블을 사용하여 많은 시간을 낭비하지 않기 때문에 해시에 모자를 걸지 마십시오.
그들은” 5 개의 서버로 구성된 25-GPU 클러스터 시스템 은 Hashcat을 실행하여 대문자와 소문자, 숫자 및 특수 문자가 포함 된 모든 8 자 암호에 대해 초당 3,500 억 개의 추측을 해독 할 수 있습니다. 여섯 시간. (그리고 2012 년에 돌아 왔습니다.)
해시 실행을 느리게 만드는 키 스트레치와 같은 기술을 사용하여 이러한 하드웨어의 속도를 상쇄 할 수 있으므로 사전 및 무차별 대입 공격이 너무 느려서 가치가 없습니다. , 그러나 하드웨어는 점점 더 빨라지고 있습니다.
2018 년 업데이트 :
현재 모범 사례에는 매우 탄력적 으로 확장되지 않은 암호문을 쉽게 해독하는 데 사용됩니다. Argon2의 PHP7 구현에서 솔트는 내부적으로 처리됩니다.
답변
지금까지 무시한 질문에 답하려고합니다.
사용해야 할 때와 사용하지 말아야하는 이유
간단한 대답은 아마추어로서 소금을 직접 처리해야하는 수준에서 암호화를 사용해서는 안된다는 것입니다.
예 : bcrypt
비밀번호 해싱 알고리즘은 내부적으로 솔트를 사용합니다.하지만이를 사용하는 개발자에게 그 사실을 노출하지 않습니다. 단순히 비밀번호를 bcrypt
(그리고 선택적으로 “수준을 설정하는 매개 변수 해시를 생성하는 데 필요한 CPU 노력 “) 및 해시를 반환합니다. 비밀번호가 올바른지 확인해야하는 경우 비밀번호와 이전에 생성 된 해시를 모두 bcrypt
전달합니다. 암호가 해시를 생성하는 데 사용 된 것인지 여부를 나타냅니다.
여기에 제공된 조언을 따르지 마 하고 솔트를 사용하여 자신의 암호를 해시하려고합니다. 이는 낮은 수준의 구현 세부 사항이며 이러한 종류의 작업이 필요한 수준에서 작업하는 경우 너무 낮은 수준의 추상화에서 작업하는 것입니다. 암호화는 올바르게 수행하기가 매우 어렵고 인터넷은 선의의 개발자 “완전히 안전하지 않은 자체 개발 암호 해싱 체계로 가득 차 있습니다.
답변
“시험 참조 70-486 ASP.NET MVC 4 웹 애플리케이션 개발 (MCSD) : ASP.NET MVC 4 웹 애플리케이션 개발” 작성자 : William Penberthy, Pearson Education, 2013 년 9 월 15 일 :
Salting은 파일 암호화 및 해시를 강화하여 파일을 손상시키기 더 어렵게 만드는 프로세스입니다. 값을 해싱하거나 암호화하기 전에 입력 텍스트의 시작 또는 끝에 무작위 문자열입니다. 예를 들어, 암호 목록을 깨뜨 리려고 할 때 해커는 가능한 암호 정보와 함께 솔트를 고려해야합니다. 솔트되는 각 값에 다른 솔트 값이 할당 된 경우 pa에 대한 잠재적 인 암호 값 테이블을 생성하는 기능 검열 프로그램이 다루기 어려워집니다.
답변
소금은 암호와 함께 암호화 된 데이터에 액세스하는 데 필요한 임의의 숫자입니다.
공격자가 암호를 모르고 무차별 대입 공격으로 추측하려고하면 그가 시도하는 모든 암호 각 소금 값으로 시도해야합니다.
따라서 1 비트 솔트 (0 또는 1)의 경우 암호화를 두 배로 어렵게 만듭니다. 2 비트 솔트는 4 배, 3 비트 솔트는 8 배 어렵게 만듭니다. 32 비트 솔트를 사용하는 암호화로 암호를 해독하는 것이 얼마나 어려운지 상상할 수 있습니다!
Comments
- 아니요. 일반적으로 소금은 공격자에게 알려진 것으로 간주됩니다. 이 경우 낮은 임계 값을 지나도 salt는 보안을 향상시키지 않습니다.
- " 일반적으로 소금은 공격자에게 알려진 것으로 간주됩니다. "-> 누가 이것을 가정합니까?
- @Mike : 누구? 누군가 가 말합니다. " 항상 공격자가 솔트를 알고 있다고 가정해야합니다. ". 다른 페이지 의 사용자는 " 소금이 공개 "라고 말합니다. 나중에는 " 염이 알려져 있습니다. 그 이유는 '가 업계 표준으로 소금이라는 단어를 사용하기 때문입니다. " 다른 은 " 소금이 공개 지식이거나 적어도 공개로 취급되어야한다고 말합니다. 지식. ".