> 백엔드 개발 > PHP 튜토리얼 > 암호 해싱의 위험과 과제

암호 해싱의 위험과 과제

尊渡假赌尊渡假赌尊渡假赌
풀어 주다: 2025-02-22 08:36:11
원래의
798명이 탐색했습니다.

암호 해싱의 위험과 과제 키 테이크 아웃

해싱은 가변 길이 데이터를 고정 길이 출력에 매핑하는 단방향 함수이지만, MD5 및 SHA-1과 같은 간단한 해싱 알고리즘은 알려진 취약점과 충돌의 타당성으로 인해 공격에 취약합니다.

. Salting Passwords는 해싱 전에 각 암호에 고유 한 값을 추가하여 무지개 테이블 및 무차별 인기와 같은 공격을 방지하여 보안을 향상시켜 주어야하지만, 익사를 방지하기 위해 소금을 안전하게 저장해야합니다. 비밀번호 스트레칭은 비밀번호를 여러 번 반복하여 보안을 증가시켜 크래킹 시도를 지연시켜 무차별적인 공격이 더 많은 시간 소모적이고 실현 가능하지 않습니다.

SHA-256 또는 BCrypt와 같은 강력하고 현대적인 해싱 알고리즘을 활용하고 소금 및 스트레칭과 같은 기술을 구현하는 것은 비밀번호 보안을 향상시키는 데 중요합니다.
    해싱 기술의 향상에도 불구하고, 계산 능력 및 기술의 발전 가능성으로 인해 방법은 전혀 완벽하지 않으며, 비밀번호 스토리지 전략의 지속적인 업데이트 및 평가의 필요성을 강조합니다.
  • .
  • 과거 기사에서 암호 해싱은 응용 프로그램에 사용자 자격 증명을 안전하게 저장하는 방법으로 논의되었습니다. 안보는 항상 논란의 여지가있는 주제이며, 많은 관점이 존재하는 정치와 종교와 비슷한 정치와 종교가 많으며 누군가를위한 '완벽한 해결책'은 다른 사람과 동일하지 않습니다. 제 생각에는 응용 프로그램의 보안 조치를 위반하는 것은 시간 문제 일뿐입니다. 컴퓨터 전력과 복잡성이 매일 증가함에 따라 오늘날의 안전한 응용 프로그램은 내일 그렇게 안전하지 않을 것입니다. 해시 알고리즘에 익숙하지 않은 독자들에게는 가변 길이의 데이터를 고정 길이의 데이터에 맵핑하는 단 한 가지 기능에 지나지 않습니다. 따라서 위의 정의를 분석하면 이러한 알고리즘의 다음 요구 사항과 특성을 이해해야합니다.
  • <:> 편도 기능 : 효율적인 알고리즘을 사용하여 출력을 되돌릴 수 없습니다. 는 가변 길이의 데이터를 고정 길이의 데이터에 맵핑합니다. 입력 메시지 공간이 "무한"일 수 있지만 출력 공간은 그렇지 않음을 의미합니다. 이는 2 개 이상의 입력 메시지가 동일한 해시를 가질 수 있다는 의미가 있습니다. 출력 공간이 작을수록 두 입력 메시지 사이에 '충돌'확률이 커집니다.
  • MD5는 실질적인 충돌을 확인했으며 충돌에 도달 할 수있는 SHA1의 확률은 매일 증가하고 있습니다 (클래식 생일 문제를 분석하여 충돌 확률에 대한 자세한 정보를 찾을 수 있습니다). SHA256, SHA512, Whirlpool 등과 같이 더 큰 출력 공간 (및 무시할만한 충돌 확률)이있는 것… ‘의사 랜덤 함수’라고도합니다. 즉, 해싱 함수의 출력은 실제 랜덤 번호 생성기 (또는 TRNG)와 구별 할 수 없어야합니다. 왜 간단한 해싱이 암호를 저장하는 데 불안한 이유 효율적인 알고리즘을 사용하여 해시 함수의 출력을 입력으로 되돌릴 수 없다는 사실이 깨질 수 없다는 것을 의미하지는 않습니다. 일반적인 단어 해시와 짧은 문자열이 포함 된 데이터베이스는 일반적으로 간단한 Google 검색으로 우리의 도달 범위 내에 있습니다. 또한, 사전 공격으로 일반적인 문자열이 쉽고 빠르게 무차별 또는 금이 갈 수 있습니다.

    .

    데모 는 데이터베이스에서 MD5 해시를 무차별하여 SQL 주입을 통해 SQL 주입을 통해 SQL 주입을 통해 비밀번호를 깨뜨릴 수있는 방법에 대한 빠른 비디오가 있습니다. 또한 우리는 가장 간단한 공격을 방금 할 수있었습니다. 해시와 Google을 잡고 해시가 온라인 데이터베이스에 존재할 가능성이 있습니다. 해시 데이터베이스의 예는 다음과 같습니다

    http://www.hash-database.net/ https://isc.sans.edu/tools/hashsearch.html

    http://md5online.net/ https://crackstation.net/

    우리는 또한 2 개 이상의 동일한 암호가 실제로 동일한 해시 값을 가지기 때문에 하나의 해시를 크랙하면 동일한 사용을 사용한 모든 단일 사용자의 비밀번호를 자동으로 제공 할 것이라고 생각해야합니다. 명확하게 말하면, 수천 명의 사용자가 있다고 말하면, 비밀번호 정책이 시행되지 않는 경우 상당한 양의 사용자가 사용될 가능성이 높습니다. 해당 비밀번호의 MD5 해시 값은 'E10ADC3949BA59ABBE56E057F20F883E'입니다. 따라서이 해시를 깨뜨릴 때 (필요한 경우) 비밀번호 필드 에이 값을 가진 모든 사용자를 검색하면 모든 사람이 사용한 모든 사람을 알게 될 것입니다. '123456'비밀번호. 소금에 절인 해시가 암호를 저장하는 데 안전하지 않은 이유 이 공격을 완화하기 위해 소금은 일반적이되었지만 오늘날의 컴퓨팅 능력에 충분하지 않습니다. 특히 소금 끈이 짧아서 무차별이 가능합니다. > 기본 비밀번호/소금 함수는

    로 정의됩니다 f (비밀번호, 소금) = 해시 (비밀번호 소금) 무차별 적 공격을 완화하려면 소금이 64 자까지 길어야하지만 나중에 사용자를 인증하려면 소금을 데이터베이스 내부에 일반 텍스트로 저장해야합니다. >

    모든 사용자가 완전히 다른 소금을 가질 것이기 때문에 간단한 해시의 문제를 피하기 때문에 2 명 이상의 사용자가 동일한 비밀번호를 사용하는지 쉽게 알 수 있습니다. 이제 해시가 다를 것입니다. 또한 더 이상 암호 해시를 직접 가져 와서 Google을 시도 할 수 있습니다. 또한 긴 소금으로 무차별 적 공격은 불가능합니다. 그러나 SQL 주입 공격 또는 데이터베이스에 직접 액세스하여 공격자 가이 소금에 접근 할 경우, 특히 사용자가 공통 비밀번호를 사용하는 경우 ( '123456'과 같은 경우) :

    그러나 하나의 암호가 금이가 되더라도 사용했을 수있는 모든 사용자에게 비밀번호를 자동으로 제공하지는 않습니다. 무작위성 문제

    좋은 소금을 생성하기 위해서는 무작위 숫자 생성기가 있어야합니다. PHP의 rand () 기능이 자동으로 마음에 팝업되면 즉시 잊어 버리십시오.

    random.org에서 임의성에 대한 훌륭한 기사가 있습니다. 간단히 말해서, 컴퓨터는

    자체로 생각할 수 없습니다. 컴퓨터는 결정 론적 기계라고합니다. 즉, 동일한 입력을 고려할 때 컴퓨터가 실행할 수있는 모든 단일 알고리즘은 항상 동일한 출력을 생성합니다.

    임의의 숫자가 컴퓨터에 요청되면 일반적으로 환경 변수 (날짜, 시간, 바이트 읽기/서면, 가동 시간의 날짜, # #)와 같은 여러 소스에서 입력을 얻은 다음 랜덤 데이터. 이것이 알고리즘에 의해 주어진 임의의 데이터를 의사 랜덤이라고 불리우므로 실제 랜덤 데이터 소스와 구별하는 것이 중요합니다. 의사-랜덤 번호 생성기 (또는 PRNG)를 실행하는 순간에 존재하는 정확한 조건을 어떻게 든 재현 할 수 있다면, 우리는 자동으로 원래 생성 번호를 갖습니다. . 또한 PRNG가 올바르게 구현되지 않으면 생성 된 데이터에서 패턴을 발견 할 수 있습니다. 패턴이 존재하는 경우 결과를 예측할 수 있습니다… 어떤 PHP 또는 Windows 버전이 사용되는지 명확하지 않지만 rand () : 를 사용하여 생성 된 비트 맵을 보면 즉시 문제가 있음을 즉시 알 수 있습니다.

    trng의 출력 이미지와 비교하십시오 : 문제가 php> = 5에서 해결되었지만 rand () 및 MT_Rand ()조차도 보안 관련 목적으로 여전히 부적절한 것으로 간주됩니다. 임의의 데이터를 생성 해야하는 경우 PHP 5> = 5.3.0으로 사용 가능한 OpenSSL_RANDOM_PSEUDO_BYTES ()를 사용하여 바이트가 충분히 안전한지 알려주는 crypto_strong 플래그도 있습니다.

    elsssl_random_pseudo_bytes () 를 사용하여 임의 문자열을 생성하는 빠른 코드 샘플이 있습니다

    비밀번호 스트레칭은 를 수행하면 효과적 일 수 있습니다 Brute-Force 공격을 추가로 완화하려면 비밀번호 스트레칭 기술을 구현할 수 있습니다. 이것은 그 자체로 해시 값을 반복해서 계산하는 반복적이거나 재귀적인 알고리즘 일뿐입니다.

    이 알고리즘은 최소 1 초 안에 모든 계산을 수행하기 위해 충분히 반복해야합니다 (해싱 속도가 느리게 공격자는 공격자가 기다려야 함을 의미합니다). 스트레칭으로 고정 된 비밀번호를 깨뜨리려면 공격자가 다음을해야합니다.

      정확한 반복 수를 알고, 모든 편차는 완전히 다른 해시를 생성합니다. . 는 각 시도마다 1 초 이상 기다려야합니다.
    1. 이것은 공격을 불가능하지만 불가능하지는 않습니다. 1 초 지연을 극복하기 위해 공격자는 알고리즘이 조정 된 컴퓨터보다 하드웨어 사양이 높아야합니다. 암호 기반 키 파생 함수 인 PBKDF2와 같은 표준 알고리즘을 사용할 수도 있습니다.
    여기서 $ 비용은 작업 계수이고 $ salt는 위의 secure_rand () 함수를 사용하여 생성 할 수있는 임의의 문자열입니다. 워크로드 계수는 대상 시스템에 전적으로 의존합니다. ‘09’의 계수로 시작하여 작업이 약에서 완료 될 때까지 늘릴 수 있습니다. 1 초.

    PHP 5> = 5.5.0 기준으로 BCrypt를 해싱의 기본 메소드로 사용하는 새 password_hash () 함수를 사용할 수 있습니다. PHP에는 Scrypt 지원이 아직 없지만 Domblack의 Scrypt 구현을 확인할 수 있습니다. 암호화 기술을 적용하는 것은 어떻습니까? 해싱 및 암호 (또는

    암호화 )는 종종 혼란스러워하는 용어입니다. 앞에서 언급했듯이 해싱은 의사 무작위 기능이며 사이퍼링은 일반적으로 입니다. 이는 출력이 TRNG와 구별 할 수없는 방식으로 입력 메시지가 슬라이스 및 변경되었지만 출력을 원래 입력으로 다시 변환 할 수 있음을 의미합니다. 이 변환은 암호화 키를 사용하여 수행되며, 이는 출력을 원본 메시지로 다시 변환하는 것이 불가능해야합니다.

    . 암호는 해싱에 비해 또 다른 큰 차이를 가지고 있습니다. 해싱의 출력 메시지 공간은 유한하지만 입력과 출력 사이의 관계는 1 : 1이므로 충돌이 존재하지 않기 때문에 암호 출력 메시지 공간은 무한합니다.
    <span>if (hash([provided password] + [stored salt]) == [stored hash]) then user is authenticated</span>
    로그인 후 복사
    . 하나는 암호화 기술을 올바르게 적용하는 방법에 매우주의를 기울여야하며, 민감한 데이터에 암호화 알고리즘을 적용하는 것만으로는 안전을 유지하기에 충분하다고 생각하면 데이터 유출로 이어질 수있는 많은 문제가 존재하기 때문에 많은 문제가 존재한다고 생각합니다. 일반적으로 자신의 암호화 구현을 적용하는 것을 고려해서는 안됩니다

    최근에 Adobe는 사용자 데이터베이스에 대한 대규모 데이터 유출이 있었는데, 암호화 기술을 잘못 적용했으며하지 말아야 할 일의 예로 사용하겠습니다. 나는 가능한 한 간단하게 노력할 것입니다. 다음 스키마를 고려하십시오

    <span>Generate some string or get entry from dictionary
    </span><span>Concatenate with salt
    </span><span>Apply hash algorithm
    </span><span>If generated hash == hash in database then Bingo
    </span><span>else continue iterating</span>
    로그인 후 복사
    테이블의 평범한 텍스트 내용이 다음과 같습니다.

    이제 Adobe의 누군가가 암호를 암호화하기로 결정했지만 두 가지 큰 실수를 저질렀습니다.

    는 동일한 암호 키를 사용하여 암호를 암호화했습니다 는 비밀번호 힌트 필드를 일반 텍스트로 남겨두기로 결정했습니다.

    예를 들어, 암호 필드에 인간화 알고리즘을 적용한 후 이제 우리의 데이터는 다음과 같습니다.
    1. 암호를 단순히 해독 할 수 없으며 간단한 방식으로 사용 된 암호화 키를 알 수 없지만 데이터를 검토하여 레코드 2와 7이 동일한 비밀번호를 공유한다는 것을 알 수 있습니다. 암호 힌트 필드가 작동하는 곳입니다. 레코드 6 힌트는 “하나입니다!”라고 우리에게 많은 정보를 제공하지는 않지만 레코드 3의 힌트는 그렇습니다. 우리는 비밀번호가“퀸”이라고 안전하게 추측 할 수 있습니다. 레코드 2와 7 힌트는 많은 정보 만 제공하지 않지만, 우리가 함께보고 있다면, 무서운 영화와 같은 휴일은 몇 개입니까? 이제 우리는“할로윈”을 암호로 사용한 모든 사람의 계정에 액세스 할 수 있습니다. 데이터 유출 위험을 완화하려면 해싱 기술로 전환하는 것이 좋습니다. 그러나 암호를 사용하여 암호를 저장 해야하는 경우 조정 가능한 암호화를 사용할 수 있습니다. 이 용어는 화려하게 보이지만 매우 간단합니다.
    2. 수천 명의 사용자가 있으며 모든 비밀번호를 암호화하려고합니다. 우리가 보았 듯이, 데이터가 위험에 처하기 때문에 모든 암호에 대해 동일한 암호화 키를 사용할 수 없습니다 (및 기타 정교한 공격이 가능해집니다). 그러나 이러한 키를 저장하면 보안 위험이되므로 모든 사용자에게 고유 한 키를 사용할 수 없습니다. 우리가해야 할 일은 단일 키를 생성하고 모든 사용자에게 고유 할 'teak'를 사용하는 것입니다. 키와 조정은 각 레코드의 암호화 키가됩니다. 사용 가능한 가장 간단한 조정은 기본 키입니다. 기본 키는 정의에 따라 테이블의 모든 레코드에 고유합니다 (사용하지는 않지만 개념을 보여주기위한 것입니다) :

  • . f (key, primarykey) = 키 1 차 키 위의 나는 단순히 최종 암호화 키를 생성하기 위해 암호화 키와 기본 키 값을 모두 연결하고 있지만 해싱 알고리즘 또는 키 파생 함수를 적용 할 수 있습니다. 또한 기본 키를 조정으로 사용하는 대신 각 레코드에 대해 비세 (소금과 유사)를 생성 할 수 있습니다. 사용자 테이블에 조정 가능한 암호화를 적용한 후 이제 다음과 같습니다.

    물론 우리는 여전히 비밀번호 힌트 문제가 있지만 이제 각 레코드에는 고유 한 값이 있으므로 사용자가 동일한 암호를 사용하는 것은 분명하지 않습니다.

    나는 암호화가 최상의 솔루션이 아니라는 것을 강조하고 싶습니다. 가능한 경우 많은 약점이 주입 될 수 있으므로 암호를 저장할 수 있도록 피해야합니다. 비밀번호를 저장하기 위해 입증 된 솔루션 (BCrypt)을 고수해야합니다. 입증 된 솔루션조차도 약점이 있음을 명심하십시오.

    결론

    완벽한 해결책은 없으며 누군가가 우리의 보안 조치를 깰 위험이 매일 증가합니다. 그러나 암호화 및 데이터 보안 연구 및 연구는 최근 스폰지 기능에 대한 상대적으로 정의하면서 툴킷이 매일 계속 성장하고 있습니다.

    . 비밀번호 해싱 에서 자주 묻는 질문 (FAQ) 암호 해싱과 암호화의 차이점은 무엇입니까?

    암호 해싱과 암호화는 데이터를 보호하는 데 사용되는 두 가지 방법이지만 다른 목적을 수행합니다. 암호화는 양방향 함수입니다. 암호화 된 내용은 적절한 키로 해독 할 수 있습니다. 즉, 누군가 암호화 키에 대한 액세스를 얻으면 데이터를 해독 할 수 있습니다. 반면에, 해싱은 일반 텍스트를 스크램블하여 고유 한 메시지 소화를 생성하는 일원 기능입니다. 입력의 작은 변화조차도 새로운 해시 값이 이전 값과 비슷하지 않은 결과적으로 급격한 변화를 일으킬 것입니다. 이로 인해 해시 값에서 원래 데이터를 재생하는 것이 불가능하여 암호를 저장하는 데 해싱이 더욱 안전 해집니다.

    암호 해싱의 소금은 어떻게 보안을 향상 시키는가?

    소금은 임의의 데이터입니다. 데이터, 암호 또는 암호를 해시하는 일원 함수에 대한 추가 입력으로 사용됩니다. 소금은 스토리지의 비밀번호를 보호하는 데 사용됩니다. 소금의 주요 기능은 사전 공격이나 미리 컴퓨터 레인보우 테이블 공격을 방어하는 것입니다. 고유 한 소금을 추가하면 두 사용자가 동일한 비밀번호를 가지고 있더라도 해시는 각 사용자마다 고유 해집니다. 이것은 해커가 해시 값에 액세스하더라도 고유 한 소금없이 암호를 깨뜨릴 수 없음을 의미합니다.

    약한 해싱 알고리즘을 사용할 위험은 무엇입니까?

    약한 해시 알고리즘, MD5 및 SHA-1과 마찬가지로 공격에 취약합니다. 그들은 취약점을 알고 있으며 현대 컴퓨팅 성능으로 비교적 쉽게 갈라질 수 있습니다. 예를 들어, 충돌 공격에 취약하며 두 개의 다른 입력이 동일한 해시 출력을 생성합니다. 이것은 데이터의 무결성을 손상시킵니다. 따라서 더 높은 수준의 보안을 제공하는 SHA-256 또는 BCrypt와 같은 더 강력한 해싱 알고리즘을 사용하는 것이 좋습니다.

    비밀번호 스트레칭은 어떻게 보안을 증가 시키는가?

    암호 스트레칭은 증가하는 데 사용되는 기술입니다. 저장된 비밀번호의 보안. 이는 소금과 함께 사용자의 비밀번호에 암호화 해시 기능을 적용한 다음 결과를 여러 번 다시 호출하여 수행됩니다. 이 프로세스는 해시 비밀번호에 걸리는 시간을 증가시켜 암호를 추측하려는 많은 빠른 시도를하는 공격자를 방해 할 수 있습니다.

    .무지개 테이블 공격이란 무엇입니까?

    무지개 테이블 공격은 공격자가 암호화 해시 기능을 되돌리기 위해 미리 계산 된 테이블 인 공격자가 해시 암호를 분해하기 위해 미리 계산 된 테이블을 사용하는 해킹 유형입니다. 레인보우 테이블에는 암호화 된 암호의 모든 일반 텍스트 순열이 포함되어 있습니다. 이 방법은 기본 해싱에 효과적이지만 각 암호에 고유 한 소금을 추가하면 해시가 무지개 테이블 공격을 방지 할 수 있습니다.

    해싱 알고리즘을 비밀로 유지하는 것이 중요한 이유는 무엇입니까?

    해싱 알고리즘을 비밀로 유지하십시오. 특히 널리 사용되는 알고리즘으로 항상 가능하지는 않습니다. 좋은 해싱 시스템의 보안은 알고리즘의 비밀에 의존하지 않습니다. 대신, 그것은 해시에 첨가 된 소금의 비밀과 무작위성에 의존합니다. 공격자가 소금없이 알고리즘을 알고 있더라도 해시에서 암호를 리버스 엔지니어링 할 수는 없습니다.

    암호 해싱에서 후추의 역할은 무엇입니까?

    후추는 생각할 수 있습니다. 두 번째로, 비밀 소금은 저장된 비밀번호의 보안을 높이기 위해 추가되었습니다. 소금은 일반적으로 해시 암호 옆의 데이터베이스에 저장되지만 후추는 비밀로 유지되고 종종 응용 프로그램 코드에 별도로 저장됩니다. 이것은 공격자가 고추없이 데이터베이스에 대한 액세스를 얻더라도 암호를 깨뜨릴 수 없다는 것을 의미합니다.

    해싱 알고리즘을 얼마나 자주 업데이트하거나 변경해야합니까?

    업데이트 빈도 또는 해싱 알고리즘을 변경하면 보호하는 데이터의 민감도 및 현재 기술 상태를 포함한 여러 요인에 따라 다릅니다. 일반적으로보다 안전한 해싱 알고리즘이 널리 허용되거나 현재 알고리즘에서 취약성이 발견되면 업데이트해야합니다. 최대의 보안을 보장하기 위해 암호화의 최신 개발에 대해 항상 정보를 유지하십시오.

    내 응용 프로그램의 성능에 대한 해시 함수의 영향은 무엇입니까?

    HASH 함수, 특히 안전한 기능은 계산적으로 될 수 있습니다. 집중적이며 응용 프로그램의 성능에 영향을 줄 수 있습니다. 그러나이 영향은 일반적으로 보안 혜택에 비해 무시할 수 있습니다. 안전한 해시 함수로 인한 지연은 실제로 암호를 추측하려는 시도를 늦추기 때문에 공격자에게 억제 ​​역할을 할 수 있습니다.

    사용자 비밀번호의 최대 보안을 어떻게 보장 할 수 있습니까?

    사용자 암호의 보안을 최대한 활용하려면 다음과 같은 모범 사례를 따르십시오. 강력하고 안전하며 최신 해싱 알고리즘을 사용하십시오. 각 비밀번호 해시에 고유 한 소금을 추가하십시오. 후추를 추가하는 것을 고려하십시오. 암호 스트레칭을 구현하십시오. 또한 최소 길이 및 문자, 숫자 및 기호의 혼합과 같은 사용자의 강력한 비밀번호 정책을 시행합니다.

위 내용은 암호 해싱의 위험과 과제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿