매번 키 파생 기능을 실행하지 않고 AES-GCM으로 많은 파일을 암호화하는 방법은 무엇입니까?
연결된 질문 : 여러 파일을 암호화하는 AES
를 사용하면 password
암호화 할 10 만 개의 파일이 있습니다. (오늘은 10 만 개 파일, 오늘은 5 만 개, 내일 10 만 개, 다음 주에는 4 만 개 파일).
지금까지이 작업을 수행했습니다 (의사 코드).
for each file: plaintext = file.read() nonce = getrandom(bytes=16) key = KDF_PBKDF2(password, salt=nonce, count=1000000) # very slow for each file! ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext) write to disk: nonce | ciphertext | tag
암호화 된 파일을 해독하려면
nonce, ciphertext, tag = file.read() key = KDF_PBKDF2(password, salt=nonce, count=1000000) # very slow for each file! plaintext = AES_GCM_cipher(key, nonce=nonce).decrypt(ciphertext)
분명히 이것은 각 파일에 대해 KDF 기능을 실행하기 때문에 최적이 아니며 느립니다!
이 솔루션에 대해 생각했습니다.
# do this ONLY ONCE for each encryption session: salt = getrandom(bytes=16) key = KDF_PBKDF2(password, salt=salt, count=1000000) # run only once for each file: plaintext = file.read() nonce = getrandom(bytes=16) ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext) write to disk: salt | nonce | ciphertext | tag
그러나 이것은
salt
각 암호화 된 파일의 시작 부분에 16 바이트 ( )를 더 추가해야한다는 단점이 있습니다 . 일반적인 관행입니까?그리고 무엇보다도 해독 할 때 다음과 같은 단점이 있습니다.
for each encrypted file: salt, nonce, ciphertext, tag = file.read() # since salt may be different for each file # we have to run: key = KDF_PBKDF2(password, salt=salt, count=1000000) # very slow for each file! ...
이후
salt
각각의 암호화 된 파일의 시작 부분에, 우리가이 방법은 우리가 해독하려는 각 암호화 된 파일에 대한 KDF 기능을 ... 실행! 이것은 매우 느릴 것입니다.우리는 그것들을 캐시에 넣을
cache[salt] = key
수 있습니다. 똑같은 것을salt
다시 찾으면 이미를 가지고key
있지만 이것이 우아한 솔루션인지 확실하지 않습니다.
질문 : AES-GCM을 사용하여 암호로 10 만 개의 파일 (한 번에 또는 여러 세션에서)을 암호화하는 데 사용할 체계는 무엇입니까?
답변
하나는 암호 기반에서 도보 거리 안 암호화에 대해 심각 KDF_PBKDF2
하지만, 실행 에 Argon2 (또는 scrypt 그것은 더 쉽게 사용할 수있는 경우)! 비트 코인 채굴은 (2020 년) 높은 속도 (220 TH / s)와 효율성 (15 pJ / H)으로 SHA-256을 수행하는 전용 ASIC가 수천 달러에 상업적으로 이용 가능함을 보여주었습니다. 이로 인해 보안 수준이 높은 애플리케이션에서 사용자가 선택한 암호를 확장하기 위해 표준 하드웨어에서 실행되는 PBKDF2-HMAC에 의존 할 수 없습니다.
제안 된 방법은 한 가지 특성을 가지고 있습니다. salt
여러 파일이 salt
함께 암호화 된 경우에만 광범위 무작위에 대해 공통 입니다. 이것은 원치 않는 정보 유출 일 수 있으며 언급 된 단점을 해결하는 방법입니다. 암호 해독에 사용되는 암호 확장 코드는 ( salt
, key
) 쌍 의 RAM 캐시를 유지할 수 있습니다 .
RNG가 끊기는 경우 안심할 수 있도록 AES-GCM을 AES-GCM-SIV로 교체 하는 것이 좋지만 데이터에 대해 두 번의 패스가 필요하다는 점을 명심하십시오.
마지막 바이트가 중요 할 때 (예 : 데이터가 바코드에 있거나 느리거나 배터리가 많이 소모되는 통신 매체를 통과하는 경우) 마지막 바이트를 잘라내는 것을 옹호 하는만큼, 우리와 같이 파일 암호화를 저장 salt
하고 nonce
크기를 조정하는 것은 권장하지 않습니다. 1980 년대입니다.