중화사전망 - 자전 검색 - Web.py 비밀번호를 안전하게 전달하는 방법 ?

Web.py 비밀번호를 안전하게 전달하는 방법 ?

암호를 보호하는 가장 좋은 방법은 해시 (소금 암호 해시) 입니다. 비밀번호를 해시하는 것은 매우 간단한 일이지만, 많은 사람들이 실수를 저지른다. 다음으로 비밀번호를 올바르게 해시하는 방법과 이유를 자세히 설명하겠습니다.

중요한 알림

코드를 직접 작성하여 비밀번호를 해시할 계획이라면 빨리 중지하세요. 잘못을 저지르는 것은 너무 쉽다. 이 알림은 모든 사람에게 적용되며, 암호 해시 알고리즘을 직접 작성하지 마십시오! 암호를 저장하는 문제에 대해 phpass 또는 이 문서에 제공된 소스 코드를 사용하는 검증된 솔루션이 있습니다.

해시라는 무엇입니까?

해시 ("hello") = 2 cf 24 db a5 fb0a30e26 e83b2 AC 5b9e29e1b161e5c

Hash ("hbllo") = 58756879c05c68dfac9866712fad6a93f8146f337a69afe7dd238f3364947

해시 ("waltz") = c0e81794384911f1777c232bb

해시 알고리즘은 단방향 함수입니다. 원하는 수의 데이터를 고정 길이의 "지문" 으로 변환할 수 있으며 되돌릴 수 없습니다. 그리고 입력이 변경되면 한 명만 있어도 출력의 해시 값이 크게 달라질 수 있습니다. 이 기능은 비밀번호를 저장하기에 딱 알맞다. 돌이킬 수 없는 알고리즘을 사용하여 저장된 비밀번호를 암호화하고 사용자가 로그인할 때 비밀번호가 정확한지 확인해야 하기 때문입니다.

해시를 사용하는 계정 시스템에서 사용자 등록 및 인증에 대한 일반적인 절차는 다음과 같습니다.

1, 사용자가 자신의 계정을 만듭니다.

사용자 암호는 해시 작업 후 데이터베이스에 저장됩니다. 일반 텍스트 암호는 서버 하드 드라이브에 저장되지 않습니다.

3. 사용자가 로그인할 때 사용자가 입력한 비밀번호가 해시되고 데이터베이스에 저장된 비밀번호 해시 값과 비교됩니다.

4. 해시 값이 정확히 같으면 사용자가 입력한 비밀번호가 정확하다고 간주됩니다. 그렇지 않으면 사용자가 잘못된 암호를 입력한 것으로 간주됩니다.

5. 사용자가 로그인을 시도할 때마다 3 단계와 4 단계를 반복합니다.

4 단계에서 계정 또는 비밀번호가 잘못되었는지 사용자에게 알리지 마십시오. 계정 또는 비밀번호가 올바르지 않은 것과 같은 일반 프롬프트만 표시됩니다. 이렇게 하면 공격자가 유효한 사용자 이름을 열거하는 것을 방지할 수 있습니다.

또한 암호 보호를 위한 해시 함수는 데이터 구조 클래스에서 볼 수 있는 해시 함수와 정확히 동일하지 않다는 점에 유의해야 합니다. 예를 들어 해시 테이블을 구현하는 해시 함수는 빠르게 설계되었지만 안전하지 않습니다. 암호화된 해시 함수만 해시 암호에 사용할 수 있습니다. 이러한 기능에는 sha256, sha5 12, ripemd, 혜립포 등이 포함됩니다.

한 가지 일반적인 개념은 비밀번호가 해시를 거친 후 안전하게 저장된다는 것이다. 이것은 분명히 정확하지 않다. 해시에서 일반 텍스트 암호를 빠르게 복구하는 방법에는 여러 가지가 있습니다. Md5 가 금이 간 웹사이트를 기억하세요. 해시 하나만 제출하면 됩니다. 1 초도 안 돼서 결과를 알 수 있을 겁니다. (존 F. 케네디, 공부명언) 분명히 간단한 해시 암호는 여전히 보안 요구 사항을 충족하지 못합니다. 다음 섹션에서는 먼저 암호 해시를 해독하고 일반 텍스트를 얻는 일반적인 방법에 대해 설명합니다.

해쉬 (hash) 를 해독하는 방법

사전과 폭력 공격.

해시를 해독하는 가장 일반적인 방법은 비밀번호를 추측하는 것이다. 그런 다음 가능한 각 비밀번호를 해시하고 해독해야 할 해시를 추측된 비밀번호 해시 값과 비교합니다. 두 값이 같으면 이전에 추측한 비밀번호가 정확한 암호문입니다. 비밀번호 공격을 추측하는 일반적인 방법은 사전 공격과 폭력 공격이다.

사전공격

사과 시도: 실패

블루베리 시도: 실패

Justinbeiber 시도: 실패

...

Letmein 시도: 실패

S3cr3t 시도: 성공!

사전 공격은 일반적으로 사용되는 암호, 단어, 구 및 암호로 사용될 수 있는 기타 문자열을 파일에 배치한 다음 파일의 각 단어를 해시하고 해독해야 하는 암호 해시와 비교하는 것입니다. 이 방법의 성공률은 암호 사전의 크기와 사전의 적합성에 달려 있다.

폭력공격

Aaaa 시도: 실패

Aaab 시도: 실패

Aaac 시도 실패

...

Acdb 시도 실패

Acdc 시도: 성공!

폭력 공격은 주어진 비밀번호 길이에 대해 가능한 모든 문자 조합을 시도하는 것이다. 이 방법은 많은 컴퓨터 시간이 필요하다. 그러나 이론적으로 충분한 시간이 있는 한 최종 비밀번호는 절대 해독될 것이다. 다만 비밀번호가 너무 길면 비밀번호를 해독하는 데 걸리는 시간은 감당하기 어려울 것이다.

현재 사전 공격과 폭력 공격을 막을 방법이 없다. 우리는 그것들을 비효율적으로 만들 수 있는 방법을 강구할 수밖에 없다. 비밀번호 해시 시스템이 안전하도록 설계되었다면 해시를 해독할 수 있는 유일한 방법은 사전이나 폭력 공격을 하는 것이다.

표를 찾아보다

특정 해시 유형의 경우 대량의 해시를 해독해야 하는 경우 조사표는 매우 효율적이고 빠른 방법입니다. 암호 사전의 각 암호를 미리 계산하는 해시입니다. 그런 다음 해시 및 해당 암호를 테이블에 저장합니다. 잘 설계된 쿼리 테이블 구조는 수십억 개의 해시가 저장되어 있더라도 초당 수백 개의 해시를 쿼리할 수 있습니다.

조회 테이블에서 해시를 해독하는 느낌을 느끼고 싶다면, CraskStation 에서 다음 SHA256 해시를 해독해 볼 수 있다.

C11083b4b0a7743af748c85d343dfe 9 fbb8b2576 c05f3a7f0d632b0926a adfc

08 EAC 03b 80 ADC 33dc 7d8 FBE 44b 7c7b 05d 3a 2c511166bdb 43 fcb 7100

E4ba5 CBD 251c98e6cd1c23f126a3b81d8d8328abc953872988

5206 b8b 8a 996 cf 5320cb12ca 91c7b 790 fba9f 030408 EFE 83 ebb 83548 DC 3007bd

역순 찾기 테이블 (역순 찾기 테이블)

사용자의 해시 목록에서 해시 검색 ...: 일치 [apple 0bob0, charles8]

사용자의 해시 목록에서 해시 (블루베리) 검색 ...: 일치 [usr 10 10 1, Timmy, John 9/kloc

사용자의 해시 목록에서 해시 검색 ...: [Wilson 10, dragonslayerX, Joe 1984]

사용자의 해시 목록에서 해시 검색 (s3cr3t) ...: [Bruce 19, knuth 1337, john87]

사용자의 해시 목록에서 해시 검색 (z@29hjja) ...: 이 비밀번호를 사용하는 사용자가 없습니다

이를 통해 공격자는 조회 테이블을 미리 계산하지 않고 대량의 hash 에 대해 사전 공격과 폭력 공격을 동시에 수행할 수 있습니다.

먼저 공격자는 얻은 데이터베이스 데이터를 기반으로 사용자 이름과 해당 해시 테이블을 만듭니다. 그런 다음 자주 사용하는 사전 암호를 해시하고 이 테이블의 해시와 비교하면 이 암호를 사용한 사용자를 알 수 있습니다. 일반적으로 많은 사용자가 동일한 암호를 사용하기 때문에 이 공격은 매우 효과적입니다.

레인보우 테이블

레인보우 테이블은 공간 교환 시간을 이용하는 기술이다. 이것은 테이블 조회 해독과 매우 유사합니다. 단지 더 작은 스토리지 공간의 목적을 달성하기 위해 약간의 균열 시간을 희생했을 뿐이다. (존 F. 케네디, 시간명언) 레인보우 테이블은 더 적은 저장 공간을 사용하기 때문에 단위 공간에 더 많은 해시를 저장할 수 있습니다. 레인보우 테이블은 이미 어떤 8 비트 길이의 md5hash 도 해독할 수 있다. 레인보우 시계의 구체적인 원리는 참고할 수 있다/

다음 장에서는' 소금 추가' 라는 기술에 대해 논의할 것이다. 이 기술을 통해 해시는 조회 테이블과 무지개 테이블을 통해 해독될 수 없다.

소금을 넣다

해시 ("hello") = 2 cf 24 db a5 fb0a30e26 e83b2 AC 5b9e29e1b161e5c

해시 ("hello"+"qxluf1bgiadekx") = 9e209040c863f84a31E7/kloc-0

해시 ("hello"+"bv5 pehsmfv11CD") = d1D3 ec2 E6 f20 FD 420d

해시 ("hello"+"yylm fy6 iehjzmq") = a49670c3c18b9e079b9cfaf51634f563dc85

조회 테이블과 레인보우 테이블은 각 비밀번호가 동일한 방식으로 해시되기 때문에 유효합니다. 두 사용자가 동일한 암호를 사용하는 경우 암호 해시가 동일해야 합니다. 각 해시를 무작위화하여 이러한 공격을 방지하고 동일한 암호를 두 번 해시하고 다른 해시를 얻을 수 있습니다.

구체적인 작업은 암호에 접두어나 접미어를 붙인 다음 해시를 하는 것이다. 이 직접적인 접미사 또는 접두사가 "소금" 으로 바뀝니다. 위에 제시된 예와 같이 소금을 첨가하면 같은 비밀번호가 매번 완전히 다른 문자열입니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 자기관리명언) 사용자가 정확한 비밀번호를 입력했는지 확인할 때도 이 salt 가 필요합니다. 따라서 salt 는 일반적으로 해시 문자열과 함께 데이터베이스에 저장되거나 해시 문자열의 일부로 저장됩니다.

소금은 비밀로 할 필요가 없다. 소금이 무작위인 한, 조회표와 무지개 시계는 무효가 된다. 공격자는 소금이 무엇인지 미리 알 수 없기 때문에 조회표와 레인보우 테이블을 미리 계산할 수 없다. 각 사용자가 서로 다른 salt 를 사용하는 경우 역표 조회 공격은 성공하지 못합니다.

다음 섹션에서는 salt 의 몇 가지 일반적인 오류 구현에 대해 살펴보겠습니다.

잘못된 방법: 짧은 소금 및 소금 재사용

가장 일반적인 오류 구현은 여러 해시에 하나의 salt 를 사용하거나 매우 짧은 salt 를 사용하는 것입니다.

소금 재사용

Salt 가 프로그램에서 하드 코딩되었든 일회성 임의 생성이든, 각 비밀번호 해시에 동일한 salt 를 사용하면 이 방어 방법이 무효화됩니다. 같은 암호 해시가 두 번 같은 결과를 얻기 때문이다. 공격자는 역표 조회를 사용하여 사전과 폭력 공격을 수행할 수 있다. 해시 사전의 각 비밀번호 앞에 이 고정 salt 를 추가하기만 하면 됩니다. 인기 있는 프로그램이 하드 코딩된 salt 를 사용하는 경우, 해시를 빠르게 해독할 수 있도록 조회 테이블과 무지개 테이블이 있을 수 있습니다.

사용자가 비밀번호를 만들거나 수정할 때마다 새로운 임의 salt 를 사용해야 합니다.

단염

Salt 의 자릿수가 너무 짧으면 공격자는 가능한 모든 salt 에 대한 조회 테이블을 미리 만들 수도 있습니다. 예를 들어, 3 자리 ASCII 문자의 salt 는 95 x 95 x 95 = 857,375 가지 가능성이 있습니다. 많이 보여요. 각 salt 가 공통 비밀번호가 포함된 1MB 조회 테이블을 생성할 경우 857,375 개의 salt 는 837GB 입니다. 지금 1TB 하드 드라이브 한 조각을 사면 몇 백 달러밖에 들지 않습니다.

같은 이유로 사용자 이름을 salt 로 사용하지 마십시오. 사용자마다 사용자 이름이 다를 수 있지만 사용자 이름은 완전히 무작위가 아니라 예측 가능합니다. 공격자는 일반 사용자 이름을 salt 로 사용하여 쿼리 테이블과 rainbow 테이블을 만들어 hash 를 해독할 수 있습니다.

일부 경험에 따르면 규칙은 salt 의 크기가 hash 함수의 출력과 일치해야 한다는 것입니다. 예를 들어 SHA256 의 출력은 256 비트 (32 바이트) 이고 salt 의 길이도 32 바이트의 임의 데이터여야 합니다.

잘못된 메서드: 이중 해시 및 이상한 해시 함수

이 섹션에서는 해시 암호에 대한 또 다른 일반적인 오해인 해시 알고리즘의 이상한 조합에 대해 설명합니다. 사람들은 서로 다른 해시 함수를 결합하면 데이터를 더욱 안전하게 만들 수 있다는 문제를 해결할 수 있습니다. 하지만 사실 이 방법은 효과가 거의 없습니다. 반대로 상호 운용성 문제가 발생할 수 있으며, 때로는 hash 를 더욱 불안하게 만들 수도 있습니다. 이 문서의 시작 부분에서 언급했듯이 자신의 해시 알고리즘을 작성하지 말고 전문가가 설계한 표준 알고리즘을 사용해야 합니다. 여러 해시 함수를 사용하면 해시 계산 속도가 느려지고 해독이 어려워질 수 있다고 생각하는 사람들도 있습니다. 해시 계산 속도를 늦추어 공격을 방어할 수 있는 더 좋은 방법이 있습니다. 이 방법에 대해서는 아래에서 자세히 설명합니다.

다음은 인터넷에서 발견된 이상한 해시 함수 조합의 예입니다.

MD5(sha 1 (암호))

MD5(MD5 (소금)+MD5 (암호))

Sha 1(sha 1 (암호))

Sha 1(str _ rot 13 (암호+salt))

MD5(sha 1(MD5(MD5 (암호)+sha 1 (암호))+MD5 (암호))

사용하지 마세요!

참고: 이 부분은 실제로 논쟁의 여지가 있습니다! 해시 함수를 결합하는 것이 의미가 있다는 이메일을 많이 받았습니다. 공격자가 우리가 어떤 함수를 사용했는지 모른다면 레인보우 테이블을 미리 계산할 수 없고 해시 함수를 결합하는 데 더 많은 계산 시간이 걸리기 때문이다.

공격자가 해시 알고리즘을 모르면 해시를 해독할 수 없다. 그러나 Kerckhoffs 원칙을 고려할 때 공격자는 일반적으로 소스 코드 (특히 자유 소프트웨어 및 오픈 소스 소프트웨어) 에 액세스할 수 있습니다. 일부 대상 시스템의 암호 해시 매핑을 통해 알고리즘을 반전시키는 것은 그리 어렵지 않습니다.

HMAC 와 같은 표준 "이상한" 해시 함수를 사용하려면 다음을 수행할 수 있습니다. 그러나 만약 당신의 목적이 hash 의 계산 속도를 늦추는 것이라면, 당신은 뒤에서 설명한 느린 hash 함수 부분을 읽을 수 있습니다. 이러한 요소를 기반으로 하는 가장 좋은 방법은 엄격한 테스트를 거친 표준 해시 알고리즘을 사용하는 것입니다.

해시 충돌 (해시 충돌)

해시 함수는 원하는 수의 데이터를 고정 길이 문자열에 매핑하기 때문에 해시 후 다른 입력이 동일한 문자열이 되는 경우가 있습니다. 암호화 해시 함수는 이러한 충돌 공격을 매우 비싸게 만들기 위한 것입니다. 그러나 암호학자들은 때때로 해시 충돌을 빠르게 실현할 수 있는 방법을 찾는다. 최근의 예는 MD5 로 충돌 공격이 이미 실현되었다.

충돌 공격은 원래 암호와 다르지만 해시가 같은 또 다른 문자열을 찾는 것입니다. 그러나 상대적으로 약한 해시 알고리즘 (예: MD5) 에서도 충돌 공격을 구현하는 데 많은 컴퓨팅 기능이 필요하므로 실제 사용에서는 해시 충돌이 거의 발생하지 않습니다. 실제로 salt MD5 를 사용하는 암호 해시는 SHA256 과 같은 다른 알고리즘만큼 안전합니다. 그러나 가능하면 SHA256, SHA5 12, RIPEMD, Whirlpool 등과 같은 보다 안전한 해시 함수를 사용하는 것이 좋습니다.

올바른 방법: 올바르게 해시하는 방법

이 장에서는 비밀번호를 올바르게 해시하는 방법에 대해 자세히 설명합니다. 제 1 장은 가장 기본이고, 이 장의 내용은 필수적이다. 다음 장에서는 보안을 지속적으로 강화하고 해시 해독을 매우 어렵게 만드는 방법에 대해 설명합니다.

기본: 소금 해시 사용

우리는 악의적인 해커가 조회 테이블과 레인보우 테이블을 통해 hash 에 해당하는 일반 텍스트 비밀번호를 빠르게 얻을 수 있다는 것을 알고 있으며, 임의 salt 를 사용하면 이 문제를 해결할 수 있다는 것도 알고 있습니다. 하지만 우리는 어떻게 salt 를 생성하고 해시 과정에서 salt 를 어떻게 사용합니까?

Salt 는 암호로 안전한 의사 난수 생성기 (cspring) 에서 생성되어야 합니다. CSPRNG 은 c 언어의 rand () 와 같은 일반 의사 난수 생성기와는 매우 다릅니다. 이름에서 알 수 있듯이 CSPRNG 는 완전히 예측할 수 없는 높은 표준 난수를 제공합니다. 우리는 우리의 소금이 예측 가능하기를 원하지 않기 때문에 CSPRNG 를 사용해야 한다.