LUKS PBKDF 如何运作?

LUKS PBKDF 如何运作?

例如,如果我们选择--pbkdf argon2id--hash blake2b-512

# printf 'YES' | cryptsetup luksFormat             \
    --type luks2     --key-file /tmp/keyfile       \
    --header /tmp/luks.header                      \
    --cipher serpent-xts-plain64  --key-size 512   \
    --use-random                                   \
    --hash blake2b-512  --pbkdf argon2id           \
    --pbkdf-force-iterations 4                     \
    --pbkdf-memory 32  --pbkdf-parallel 1          \
    /dev/loop0

从标头argon2id转到键槽。哈希blake2b-512值用于消化

消化到底有什么作用?来自LUKS2规格, 它指出摘要用于验证从密钥槽解密的密钥是否正确。如果我正确理解,摘要仅用于验证我们的密码/密钥文件,但与生成卷主密钥无关。

# cryptsetup luksDump /tmp/luks.header

LUKS header information
Version:        2
Epoch:          3
Metadata area:  16384 [bytes]
Keyslots area:  16744448 [bytes]
UUID:           fa2562ec-b396-43b7-8d81-e5f4ffb96bb0
Label:          (no label)
Subsystem:      (no subsystem)
Flags:          (no flags)

Data segments:
  0: crypt
        offset: 0 [bytes]
        length: (whole device)
        cipher: serpent-xts-plain64
        sector: 4096 [bytes]

Keyslots:
  0: luks2
        Key:        512 bits
        Priority:   normal
        Cipher:     serpent-xts-plain64
        Cipher key: 512 bits
        PBKDF:      argon2id
        Time cost:  4
        Memory:     32
        Threads:    1
        Salt:       ab bc 1b 5b d9 19 2b ce 04 59 1c 31 97 cc 03 d9 
                    13 5a 6f 54 6a 1b 81 b8 c6 93 0e 19 d1 a0 0c 15
        AF stripes: 4000
        AF hash:    blake2b-512
        Area offset:32768 [bytes]
        Area length:258048 [bytes]
        Digest ID:  0
Tokens:
Digests:
  0: pbkdf2
        Hash:       blake2b-512
        Iterations: 1000
        Salt:       78 4e 17 12 70 f5 63 18 49 bf 79 24 9f 35 d2 7e     
                    b0 e3 3e b2 85 5e 0e 64 9a 2e 31 9e 76 13 4e 24     
        Digest:     bf 97 93 6b 6a 0c b6 58 bd c6 1e 3d 7b ec d3 d5 
                    52 4d f7 f2 b5 9d 19 69 7d dd 7f aa 0c 90 bc 7e     
                    4d 4c ad 2a 3a 4f dd 92 d7 d2 16 df ca 3b 57 8d 
                    85 99 76 48 f6 59 fa 6a e2 dc 64 80 5f bc cc 35

使用luksDump --dump-master-key,我们可以查看 512 位音量主键简单的十六进制。

# printf 'YES' | cryptsetup luksDump --dump-master-key --key-file /tmp/keyfile /tmp/luks.header

LUKS header information for /tmp/luks.header
Cipher name:    serpent
Cipher mode:    xts-plain64
Payload offset: 0
UUID:           fa2562ec-b396-43b7-8d81-e5f4ffb96bb0
MK bits:        512
MK dump:        84 c3 c7 1d 8b bd f8 cd 29 5d 5d ee 08 10 da 70 
                0c 8e 45 af 9f 58 80 3d 49 46 e4 4d fe 75 37 c0 
                89 30 d4 fe a8 27 76 71 16 0c f2 4e aa d8 27 b4 
                6e c2 e4 f0 c6 5a 86 cf fe 35 ff fd f0 df e6 62

我尝试使用 Argon2 程序和已知的盐来生成卷主密钥。使用 Argon 中的相同设置(iteration count=4memory cost=32parallel cost=1),我无法获得相同的哈希结果。

# eval 'cat /tmp/keyfile | argon2 '$(printf "\xab\xbc\x1b\x5b\xd9\x19\x2b\xce\x04\x59\x1c\x31\x97\xcc\x03\xd9\x13\x5a\x6f\x54\x6a\x1b\x81\xb8\xc6\x93\x0e\x19\xd1\xa0\x0c\x15")' -id -t 4 -m 5 -p 1 -l 64'

Type:           Argon2id
Iterations:     4
Memory:         32 KiB
Parallelism:    1
Hash:           83ed8343d0539ba4f44fd79ac1becce1c7dd5001b7098f0cfb6a6cc7a07123890ccafb4cf8b7a8cb3ba1475e738f1268fb66eb89c42faf8460272878781cd952
Encoded:        $argon2id$v=19$m=32,t=4,p=1$q7wbW9kZK84EWRwxl8wD2RNab1RqG4G4xpMOGdGgDBU$g+2DQ9BTm6T0T9eawb7M4cfdUAG3CY8M+2psx6BxI4kMyvtM+LeoyzuhR15zjxJo+2bricQvr4RgJyh4eBzZUg
0.000 seconds
Verification ok

LUKS 如何利用我们的密码,经过 Argon PBKDF 加盐处理,然后获得卷主密钥?

答案1

我尝试使用 Argon2 程序和已知的盐来生成卷主密钥。

从您的密码和盐派生的密钥用于解密存储在密钥槽中的卷密钥(还使用反取证分离器,在LUKS1 规范,第 2.4 节)。因此,您仅生成了用于解密主密钥的密钥,而不是主密钥本身。

如果我正确理解,摘要仅用于验证我们的密码/密钥文件,但与生成卷主密钥无关。

是的。您从密钥槽中取出解密的密钥并使用它来计算摘要,然后将计算出的摘要与标头中存储的摘要(在初始化密钥槽时生成)进行比较。如果它们匹配,则提供的密码正确。

相关内容