키 스트레칭
Key stretching암호학에서 키 스트레칭 기법은 가능한 약한 키(일반적으로 암호 또는 암호)를 만들기 위해 사용되며, 가능한 각 키를 테스트하는 데 필요한 자원(시간 및 공간)을 증가시킴으로써 무차별 공격으로부터 더 안전하게 한다. 인간이 만든 암호나 암호는 암호 균열이 가능할 정도로 짧거나 예측 가능한 경우가 많은데, 키 스트레칭은 암호 후보 단일화를 시도하는 기본 단계를 복잡하게 만들어 그러한 공격을 더욱 어렵게 만들려는 의도다. 키 스트레칭은 또한 키 길이가 제약된 일부 실제 애플리케이션에서 더 긴 키 길이를 무차별 공격자의 관점에서 모방함으로써 보안을 향상시킨다.[1]
키 스트레칭을 하는 방법에는 몇 가지가 있다. 한 가지 방법은 암호해시함수나 블록 암호를 반복적으로 루프에 적용하는 것이다. 예를 들어, 키가 암호에 사용되는 응용 프로그램에서는 암호의 키 일람표를 수정하여 수행하는데 특정한 시간이 소요되도록 할 수 있다. 또 다른 방법은 메모리 요구사항이 큰 암호 해시함수를 사용하는 것이다 – 이것들은 메모리에 묶인 적들의 공격을 좌절시키는 데 효과적일 수 있다.
과정
키 스트레칭 알고리즘은 입력 키를 받은 다음 임의성과 긴 키 길이를 모방한 확장 암호(향상된 키라고[citation needed] 함)를 생성하기 위해 상당한 노력을 기울이는 알고리즘에 의존한다. 알고리즘에는 알려진 바로 가기가 없어야 하므로 입력과 암호와 관련된 가장 효율적인 방법은 키 스트레칭 알고리즘 자체를 반복하는 것이다. 이 공격자들은 각 시도에 대해 같은 노력을 기울이도록 맹렬히 공격한다. 이 추가 작업이 특정 키 길이를 가진 모든 키의 브루트 포스 키 검색과 비교될 경우 입력 키는 동일한 길이로 늘어난 것으로 설명될 수 있다.[1]
키 스트레칭은 공격자에게 다음과 같은 두 가지 옵션을 제공한다.
- 확장된 키의 가능한 조합을 시도하십시오. 그러나 확장 키가 충분히 길고 예측 불가능한 경우(즉, 알고리즘은 공격자가 전체 확장된 키 공간을 시험해야 할 만큼 임의성을 잘 흉내 낸다).
- 약한 초기 키의 가능한 조합을 시도하십시오. 초기 키가 암호 또는 암호일 경우 잠재적으로 사전 공격을 시작할 수 있지만, 각 평가판에 대한 공격자의 추가 노력으로 계산 및 메모리 소모가 예상 수익을 초과할 경우 공격이 경제적이지 않을 수 있음
공격자가 사용자와 동일한 클래스의 하드웨어를 사용하는 경우, 각 추측에 대해 사용자가 처리한 것과 유사한 시간(예: 1초)이 소요된다. 공격자가 사용자보다 훨씬 더 큰 컴퓨팅 자원을 가지고 있더라도, 키 스트레칭은 공격자의 속도를 늦추는 동시에 합법적인 사용자에 대한 시스템의 사용성에 심각한 영향을 미치지 않는다. 이는 사용자의 컴퓨터는 사용자가 비밀번호를 입력할 때 스트레칭 기능을 한 번만 계산하면 되는 반면, 공격자는 공격에서 모든 추측에 대해 스트레칭 기능을 계산해야 하기 때문이다.
이 프로세스는 원래 키 공간 엔트로피를 변경하지 않는다. 키 스트레칭 알고리즘은 결정론적이며, 약한 입력이 항상 동일한 확장 키를 생성하도록 허용하지만, 따라서 확장된 키를 입력 키 공간보다 더 이상 가능한 조합으로 제한한다. 따라서 이 공격은 향상된 키 공간의 여러 인스턴스를 병렬로 조준하는 무지개 테이블을 개발하는 등 특정 시간 메모리 트레이드오프에 대해 보호되지 않은 경우(효과적으로 알고리즘을 반복하는 지름길) 취약하다. 이 때문에 키 스트레칭이 염장술과 결합되는 경우가 많다.[1]
해시 기반
많은 라이브러리는 키 스트레칭을 기능의 일부로 수행하는 기능을 제공한다. 예를 들어 crypt(3)를 참조한다. PBKDF2는 암호에서 암호화 키를 생성하기 위한 것이며, 암호 인증에 반드시 필요한 것은 아니다. 출력 비트 수가 PBKDF2에서 사용되는 내부 해싱 알고리즘보다 작거나 같은 경우 PBKDF2를 둘 다 사용할 수 있으며, 일반적으로 SHA-2(최대 512비트) 또는 정적 데이터를 암호화하는 암호화 키로 사용된다.
힘과 시간
이 예들은 개인용 컴퓨터가 1초에 약 65,000개의 SHA-1 해시를 할 수 있다고 가정한다. 따라서 키 스트레칭을 사용하는 프로그램은 해시 6만5000발을 사용할 수 있으며, 최대 1초까지 사용자를 지연시킬 수 있다. 2019년 7월부터 $700 GPU가 1초에 100억 이상의 SHA-1 해시를 할 수 있다는 점에 유의하십시오.[2]
평가판 암호 또는 암호를 테스트하려면 일반적으로 해시 작업을 한 번 수행해야 한다. 그러나 키 스트레칭을 사용한 경우 공격자는 각 키에 대해 강화된 키를 계산해야 한다. 즉, 테스트당 계산해야 할 해시가 6만 5천 개에 달한다. 이는 공격자의 작업량을 약 2인16 65,000배 증가시킨다. 이는 향상된 키가 키 강도에 약 16비트의 가치를 더한다는 것을 의미한다.
무어의 법칙은 컴퓨터 속도가 대략 1.5년마다 두 배씩 증가한다고 주장한다. 이러한 가정 하에서 1.5년마다 1비트 이상의 키 강도는 그럴듯하게 강압을 가할 수 있다. 이는 16개의 추가 강도의 값이 약 16×1.5 = 24년 후 균열된 값이라는 것을 의미하지만, 동일한 수준의 보안을 유지하기 위해 시스템이 사용하는 키 스트레칭 라운드의 수를 약 1.5년마다 두 배로 늘려야 함을 의미한다(대부분의 키가 필요 이상으로 안전하므로, 일관성 있는 결정론적 키 생성이 필요한 시스템).ation은 키 스트레칭에 사용되는 반복 횟수를 업데이트하지 않을 것이다. 이러한 경우 설계자는 키 파생 시스템이 변경되지 않고 변경되기를 얼마나 오랫동안 원하는지 고려해야 하며 시스템의 수명 동안 적절한 해시 수를 선택해야 한다.
CPU 바인딩 해시함수는 여전히 하드웨어 구현에 취약하다. 그러한 SHA-1 구현은 5,000개의 게이트와 400개의 클럭 사이클을 사용하여 존재한다.[3] 수백만 개의 게이트 FPGA가 100달러 미만인 상황에서 공격자는 약 5,000달러에 완전히 밀리지 않은 하드웨어 크래커를 만들 수 있다.[4][citation needed] 100MHz로 측정된 이러한 설계는 초당 약 30만 개의 키를 테스트할 수 있다. 공격자는 $2,500에 150,000의 키/초 설계와 같이 좋은 가격/속도 절충을 자유롭게 선택할 수 있다.[citation needed] 키 스트레칭은 여전히 그러한 상황에서 공격자의 속도를 늦춘다; 직선 SHA-1 해시를 공격하는 5,000달러의 설계는 30만 ÷216 ≈ 4.578 key/초를 시도할 수 있을 것이다.[citation needed]
하드웨어 접근방식에서 방어하기 위해 메모리 바인딩 암호기능이 개발되었다. 이것들은 캐시가 효과적이지 않은 예측 불가능한 방식으로 대량의 메모리에 접근한다. 대기 시간이 짧은 메모리는 많은 양이 비싸기 때문에 공격자가 될 가능성이 큰 사람은 크게 단념한다.
역사
최초의 고의적으로 느린 비밀번호 기반 키 파생 함수 "CHYPT"는 1978년 로버트 모리스가 유닉스 비밀번호 암호화를 위해 기술한 것이다.[5] 하위 기능으로 25의 반복 계수, 12비트 소금, DES의 변종을 사용했다. (표준 DES 하드웨어를 사용하여 공격을 좌절시키려는 시도로 DES quipment를 피했다.) 암호는 최대 8개의 ASCII 문자로 제한되었다. 당시로서는 대단한 진보였지만, CRIPT(3)는 현재 불충분한 것으로 간주되고 있다. PDP-11 시대를 위해 고안된 반복 횟수는 너무 적고, 소금 12비트는 불편하지만 사전 계산된 사전 공격을 멈추지 않으며, 8자 제한은 더 강한 암호의 사용을 방지한다.
PBKDF2와 같은 현대의 암호 기반 키 파생 함수는 SHA-2, 긴 소금(예: 64비트) 및 높은 반복 횟수와 같은 암호 해시를 사용한다. 미국 국립표준기술원(NIST)은 "특히 중요한 키의 경우나 사용자 지정 성능이 중요하지 않은 매우 강력한 시스템이나 시스템의 경우 반복 횟수가 1000만 회가 적당할 수 있다"[6]: 5.1.1.2 고 권고했다. [7]: 5.2
2009년에는 키 테스트 속도를 높이기 위해 사용자 정의 고 병렬 하드웨어의 사용을 제한할 목적으로 메모리 집약적인 키 강화 알고리즘인 스크립트가 도입되었다.[8][9]
2013년에는 그래픽 프로세서와 특수 용도 하드웨어의 공격에 저항할 수 있는 개선된 키 스트레칭 표준을 선정하기 위한 암호 해싱 대회가 개최되었다. 우승자 아르곤2는 2015년 7월 1일에 선정되었다.[10]
키 스트레칭을 사용하는 일부 시스템
일부 Disk 암호화 소프트웨어(디스크 암호화 소프트웨어 비교 참조):
- 7-ZIP[11]
- Apache .htpasswd "APR1" 및 OpenSSL "passwd"는 MD5 키 스트레칭 1000라운드를 사용한다.
- KeyPass와 KeyPassXC, 오픈 소스 암호 관리자 유틸리티. 2020년 현재 최신 버전은 기본 키 스트레칭 지연 1초와 함께 Argon2d를 사용한다.[12][13]
- Linux와 일부 다른 Unix 유사 시스템은 기본적으로 5000 SHA256 또는 SHA512 해시 반복을 수행하는 SHAcrypt 모드를 제공하며, 최소 1000과 최대 999,999,999를 제공한다.[14]
- 암호 안전한 오픈 소스 암호 관리자.
- PGP, GPG 암호화 소프트웨어. GPG는 기본적으로 해시를 65536회 반복한다.[15]
- 개인 모드의 Wi-Fi Protected Access(WPA 및 WPA2) 무선 암호화 프로토콜 4096회 반복 PBKDF2 사용. (WPA3는 암호 해시를 노출하지 않는다고 주장하는 동등의 동시 인증 사용)
참고 항목
참조
- ^ a b c Kelsey J, Schneier B, Hall C, Wagner D (1998). Okamoto E, Davida G, Mambo M (eds.). "Secure applications of low-entropy keys". Lecture Notes in Computer Science. Springer. 1396 (volume 1936, Information Security: First International Workshop, ISW'97, Japan): 121–134. doi:10.1007/BFb0030415. ISBN 978-3-540-64382-1.
- ^ [1], 1,000회 반복 PBKDF2-HMAC-SHA1은 5,164.9 kH/s의 속도로 2,002 SHA-1 해시가 발생하며, 이는 초당 1,340,129,800 SHA-1 해시에 해당한다.
- ^ http://events.iaik.tugraz.at/RFIDSec08/Papers/Publication/04%20-%20ONeill%20-%20Low%20Cost%20SHA-1%20-%20Slides.pdf
- ^ "Archived copy". Archived from the original on 2011-07-16. Retrieved 2010-08-08.
{{cite web}}
: CS1 maint: 타이틀로 보관된 사본(링크) - ^ Morris, Robert; Thompson, Ken (1978-04-03). "Password Security: A Case History". Bell Laboratories. Archived from the original on 2003-03-22. Retrieved 2011-05-09.
- ^ Grassi Paul A. (June 2017). SP 800-63B-3 – Digital Identity Guidelines, Authentication and Lifecycle Management. NIST. doi:10.6028/NIST.SP.800-63b.
- ^ Meltem Sönmez Turan, Elaine Barker, William Burr, and Lily Chen (December 2010). SP 800-132 – Recommendation for Password-Based Key Derivation, Part 1: Storage Applications. NIST. doi:10.6028/NIST.SP.800-132.
{{cite book}}
: CS1 maint : 복수이름 : 작성자 목록(링크) - ^ 스크립트
- ^ 스크립트: 새로운 키 파생 함수인 콜린 퍼시벌, BSDCan 2009, 2011-2-1에 액세스
- ^ 암호 해싱 대회
- ^ https://7-zip.org/7z.html
- ^ KBDF 4
- ^ KeyPassXC—첫 번째 데이터베이스 만들기
- ^ Drepper, Ulrich. "Unix crypt using SHA-256 and SHA-512".
- ^ RFC 4880