LUKS가 해시를 생성해야 하는 이유는 무엇입니까?

LUKS가 해시를 생성해야 하는 이유는 무엇입니까?

새로운 LUKS 장치를 생성하는 경우 옵션 -hash및 를 지정할 수 있습니다 -iter-time.

예를 들어:

 sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0

cryptsetup 맨페이지에서:

--해시, -h

생성 작업의 경우 비밀번호 해싱에 사용되는 해시를 지정합니다.

luksFormat 작업의 경우 LUKS 키 설정 체계와 볼륨 키 다이제스트에 사용되는 해시를 지정합니다.

첫 번째 문장 때문에 나는 해시가 지정된 알고리즘(예: sha512)에 의해 생성되는 표준 Linux 시스템에서와 유사한 방식으로 해시가 사용된다고 순진하게 가정했습니다. 해시를 가지고 있고 사전 공격을 시도하려는 공격자가 더 어렵게 만들기 위해 해시를 솔트하고 알고리즘을 n 번 반복하여 계산 시간을 늘립니다. 이 경우 has 값은 에 저장됩니다 /etc/shadow. 사용자가 로그인한 경우 해시 값이 계산되어 /etc/shadows파일의 값과 비교됩니다. 동일하면 사용자가 로그인할 수 있습니다. 비슷한 방식으로 파일을 소유한 공격자 (솔트 값도 알고 있음)는 사전에 있는 단어를 기반으로 해시를 계산하고 특정 문자열이 일치할 때까지 /etc/shadow파일의 값과 비교할 수 있습니다 ./etc/shadow

LUKS의 해시가 비슷한 방식으로 사용되는 경우 어딘가(예: 파티션 헤더)에 저장되어야 하며 어떤 이유로 공격자가 파티션 헤더(또는 저장된 파일)에 액세스할 수 있다고 가정합니다. ), 그는 위와 비슷한 방법을 사용하여 비밀번호를 알아낼 수 있습니다. 이것은 해시 값을 얻는 방법에 대한 질문으로 이어집니다.LUKS 장치의 해시 값을 추출하는 방법은 무엇입니까?

LUKS 시스템이 어떻게 작동하는지 생각해보면, 그것이 사용되는 방식이 아닌 것 같아요. 대신 비밀번호는 암호화 키로만 사용되고(해시는 어디에도 저장되지 않음) 헤더에 암호화되어 저장되는 것 같습니다. 그러나 LUKS 매뉴얼 페이지에서 키 암호화에 사용할 암호화 알고리즘과 이를 변경하는 방법에 대한 힌트를 찾지 못했습니다. (이 옵션은 --cipher aes-cbc-essiv:sha256 --key-size 256키가 아닌 파티션을 암호화하는 데 사용되는 실제 알고리즘을 나타냅니다.) 이것은 나에게 이러한 이해도 틀렸다는 것을 암시합니다.

그렇다면 이 모든 것이 정확히 어떻게 작동하며 위 해시의 목적은 무엇입니까? 누군가가 위의 내 오해를 명확히 할 수 있다면 좋을 것입니다(그리고 몇 가지 참고 자료가 있을 수도 있습니다).

답변1

LUKS 형식에는 여러 개의 키 슬롯이 있으며 각 슬롯에는 데이터 암호화를 위한 암호화 마스터 키가 포함될 수 있습니다. 이 마스터 키는 귀하의 비밀번호에서 파생된 다른 키를 사용하여 암호화됩니다.

일반 키를 사용하여 hash_function(passphrase)키를 생성하는 것은 어리석은 일입니다. sha1과 같은 해시는 빠르게 계산될 수 있기 때문입니다(SHA-1은사과메시지 유효성을 검사하는 알고리즘아니요일반 비밀번호로 사용됩니다.)

비밀번호 기반 데이터 암호화의 경우 무차별 대입 공격을 방지하기 위해 기능이 느려지길 원합니다. 이렇게 하려면 PBKDF2(비밀번호 기반 키 파생 함수)를 사용하세요(정보 참조).이 Sec.SE 질문동기 부여 및 기타 예).

derivedKey = PBKDF2(hash_function, passphrase, salt, iterations, derivedKeyLen)

내가 설치한 hash_function은 다음과 같이 sha1입니다 cryptsetup --help.

Default compiled-in key and passphrase parameters:
        Maximum keyfile size: 8192kB, Maximum interactive passphrase length 512 (characters)
Default PBKDF2 iteration time for LUKS: 1000 (ms)

Default compiled-in device cipher parameters:
        loop-AES: aes, Key 256 bits
        plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160
        LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha1, RNG: /dev/urandom

내보낸 키 길이는 데이터 암호화에 사용되는 암호에 따라 다릅니다. 반복 횟수는 프로세서 속도에 따라 다릅니다.

이러한 세부 정보는 cryptsetup 매뉴얼 페이지에서 찾을 수 있습니다(pbkdf2에서는 경고음이 울려야 함). 추가 보안 세부정보는 다음을 참조하세요.비밀번호 설정 FAQ.

답변2

맞습니다. 암호화 자격 증명을 저장하는 것과 인증 자격 증명을 저장하는 것은 서로 다른 문제입니다.

사용자가 로그인할 때 운영 체제에는 사용자가 입력한 비밀번호와 비교할 수 있는 비밀번호의 참조 사본이 있어야 합니다. 입력한 비밀번호가 참조 비밀번호와 동일하면 인증에 성공합니다. 비밀번호 복구를 어렵게 하기 위해 시스템은 비밀번호를 저장하지 않습니다.해시시(느린 솔트 해시를 사용하면 무차별 암호 대입 시도가 훨씬 더 어려워집니다.)

암호화는 다르게 작동합니다. 그 목적은 스토리지에 접근하는 공격자로부터 보호하는 것입니다. 따라서 암호화 키는 기기에 저장된 것에서만 추출할 수 없습니다. 따라서 키는 기기에 저장되지 않고 기기에 저장된 정보와 사용자가 제공한 정보를 결합하여 구성됩니다. 일반적으로 키는 사용자가 제공한 비밀번호와 결합된 장치에 저장된 솔트를 기반으로 생성됩니다. 또한, 무차별 공격 시도를 늦추려면 이러한 값을 결합하는 과정을 느리게 해야 하며, 사용자의 비밀번호 외에 장치별 값(솔트)을 사용해야 동일한 비밀번호를 사용해도 동일한 키가 발생하지 않도록 해야 합니다. .

암호화의 관점에서 볼 때 느린 비밀번호 해시와 느린 키 파생 기능은 동일한 문제인 것으로 나타났습니다.키 스트레치. 럭스용PBKDF2는 사실상의 표준 키 확장 기능 중 하나입니다(비밀번호 크래킹의 기술 발전으로 인해 bcrypt 또는 scrypt가 더 선호되지만). 최신 UNIX 시스템은 유사한 메커니즘을 사용합니다.비밀번호 해싱("MD5" 또는 "SHA-512"는 실제로 반복적이며 PBKDF2와 구조가 유사합니다.)

사용자가 제공한 비밀번호가 올바르지 않은 경우 데이터 복호화는 가비지를 반환합니다.

대부분의 다른 암호화 메커니즘과 마찬가지로 LUKS는 암호 파생 키를 데이터 암호화 키로 사용하지 않습니다. 대신 데이터 암호화 키는 장치가 생성될 때 무작위로 생성되지만 직접 저장되지는 ​​않습니다. LUKS는 해당 키를 사용하여 암호화된 각 비밀번호 파생 키의 복사본을 저장합니다. LUKS 용어에서 각 비밀번호 파생 키는 볼륨 헤더의 위치를 ​​차지합니다. 각 슬롯은 비밀번호에 해당합니다. 당신은 읽을 수있다TKS1 종이2계층 암호화 방식에 대한 세부정보입니다.

관련 정보