Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

PEP 452 – 암호화 해시 함수 API v2.0

Author:
A.M. Kuchling <amk at amk.ca>, Christian Heimes <christian at python.org>
Status:
Final
Type:
Informational
Created:
15-Aug-2013
Post-History:

Replaces:
247

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

초록

MD5나 SHA와 같은 암호화 해시 알고리즘을 구현하는 여러 모듈을 사용할 수 있습니다. 이 문서는 이러한 알고리즘을 위한 표준 API를 지정하여 서로 다른 구현 간에 쉽게 전환할 수 있도록 합니다.

사양

모든 해시 모듈은 동일한 인터페이스를 제공해야 합니다. 추가 메서드나 변수를 추가할 수 있지만, 이 문서에 설명된 항목은 항상 존재해야 합니다.

해시 함수 모듈은 다음 함수를 정의합니다.

new([string])            (키 없는 해시)

new(key, [string], [digestmod])    (키가 있는 해시)
새 해시 객체를 생성하여 반환합니다. 첫 번째 형식은 MD5나 SHA와 같이 키가 없는 해시를 위한 것입니다. HMAC과 같은 키가 있는 해시의 경우, ‘key’는 사용할 키를 지정하는 문자열을 포함하는 필수 매개변수입니다. 두 경우 모두 선택적 ‘string’ 매개변수가 제공되면, obj.update(string)을 호출한 것처럼 객체의 초기 상태에 즉시 해시됩니다.

해시 객체를 생성한 후 update()메서드를 사용하여 임의의 바이트를 객체에 입력할 수 있으며, 언제든지 객체의 digest()메서드를 호출하여 해시 값을 얻을 수 있습니다.

매개변수 이름은 ‘string’이지만 해시 객체는 8비트 데이터만 처리합니다. ‘key’와 ‘string’은 모두 바이트 유사 객체(bytes, bytearray…)여야 합니다. 해시 객체는 1차원 연속 버퍼를 인자로 지원할 수도 있습니다. Python 3.x에서는 텍스트(unicode)를 더 이상 지원하지 않습니다. Python 2.x 구현은 ASCII만 포함하는 unicode를 인자로 받을 수 있지만, 이 기능에 의존해서는 안 됩니다.

이 함수에 임의의 추가 키워드 인자를 추가할 수 있지만, 제공되지 않은 경우에는 합리적인 기본값을 사용해야 합니다. 예를 들어, 가변적인 라운드 수와 여러 출력 크기를 지원하는 해시 함수에는 ‘rounds’ 및 ‘digest_size’ 키워드를 추가할 수 있으며, 이러한 키워드의 기본값은 안전하다고 여겨지는 값이어야 합니다.

해시 함수 모듈은 다음 변수를 정의합니다.

digest_size
정수 값이며, 이 모듈에서 생성한 해시 객체가 생성하는 다이제스트의 크기(바이트 단위)입니다. 샘플 객체를 생성하고 해당 객체의 ‘digest_size’ 속성에 액세스하여 이 값을 얻을 수도 있지만, 모듈에서 이 값을 바로 사용할 수 있으면 편리할 수 있습니다. 출력 크기가 가변적인 해시는 이 변수를 None으로 설정합니다.

해시 객체에는 다음 속성이 필요합니다.

digest_size
이 속성은 모듈 수준의 digest_size 변수와 동일하며, 해시 객체가 생성하는 다이제스트의 크기를 바이트 단위로 나타냅니다. 해시의 출력 크기가 가변적인 경우, 해시 객체를 생성할 때 이 출력 크기를 선택해야 하며, 이 속성에는 선택한 크기가 포함되어야 합니다. 따라서 None은 이 속성에 대해 유효한 값이 아닙니다.
block_size
정수 값 또는 NotImplemented; 해시 알고리즘의 내부 블록 크기(바이트)입니다. 블록 크기는 HMAC 모듈이 비밀 키를 digest_size로 패딩하거나, 비밀 키가 digest_size보다 긴 경우 비밀 키를 해시하는 데 사용됩니다. 해시 알고리즘에 대한 HMAC 알고리즘이 표준화되어 있지 않으면 대신 NotImplemented을 반환합니다.
name
텍스트 문자열 값으로, 해시 알고리즘의 표준 소문자 이름입니다. 이름은 hashlib.new에 적합한 매개변수여야 합니다.

해싱 객체는 다음 메서드를 필요로 합니다.

copy()
이 해싱 객체의 별도 복사본을 반환합니다. 이 복사본을 업데이트해도 원본 객체에는 영향을 주지 않습니다.
digest()
이 해싱 객체의 해시 값을 8비트 데이터를 포함하는 바이트열로 반환합니다. 이 함수는 객체를 어떤 방식으로도 변경하지 않으므로, 이 함수를 호출한 후에도 객체를 계속 업데이트할 수 있습니다.
hexdigest()
이 해싱 객체의 해시 값을 16진수 숫자를 포함하는 문자열로 반환합니다. ‘a’부터 ‘f’까지의 숫자에는 소문자를 사용해야 합니다. .digest()메서드와 마찬가지로 이 메서드는 객체를 변경해서는 안 됩니다.
update(string)
바이트열과 유사한 ‘string’을 해싱 객체의 현재 상태에 해시합니다. update()는 해싱 객체의 수명 동안 임의의 횟수만큼 호출할 수 있습니다.

해싱 모듈은 추가 모듈 수준 함수나 객체 메서드를 정의하면서도 이 사양을 준수할 수 있습니다.

‘MD5’라는 모듈을 사용하는 예는 다음과 같습니다.:

>>> import hashlib
>>> from Crypto.Hash import MD5
>>> m = MD5.new()
>>> isinstance(m, hashlib.CryptoHash)
True
>>> m.name
'md5'
>>> m.digest_size
16
>>> m.block_size
64
>>> m.update(b'abc')
>>> m.digest()
b'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
>>> m.hexdigest()
'900150983cd24fb0d6963f7d28e17f72'
>>> MD5.new(b'abc').digest()
b'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'

근거

해시 알고리즘의 크기는 일반적으로 비트 단위로 표시되지만 다이제스트 크기는 비트가 아닌 바이트 단위로 측정합니다. 예를 들어 MD5는 16바이트 알고리즘이 아니라 128비트 알고리즘입니다. 이는 제가 살펴본 샘플 코드에서 비트 단위 길이는 거의 사용되지 않는 반면, 바이트 단위 길이는 파일에서 앞이나 뒤로 이동하거나 출력 문자열의 길이를 계산할 때 자주 필요하기 때문입니다. 따라서 비트 단위 크기가 실제로 필요한 소수의 사용자가 digest_size에 8을 곱해야 하는 부담을 지게 됩니다.

update()메서드의 이름을 append()로 정하는 편이 더 좋다는 의견이 제시되었습니다. 그러나 이 메서드는 실제로 해싱 객체의 현재 상태를 업데이트하며, update()는 Python에 포함된 md5 및 sha 모듈에서 이미 사용되고 있으므로 update()라는 이름을 그대로 두는 것이 가장 간단해 보입니다.

키가 있는 해시의 생성자 인수 순서는 해결하기 어려운 문제였습니다. 키를 첫 번째에 배치해야 하는지 두 번째에 배치해야 하는지가 명확하지 않았습니다. 필수 매개변수이며 일반적인 관례는 필수 매개변수를 먼저 배치하는 것이지만, 이는 ‘string’ 매개변수가 첫 번째 위치에서 두 번째 위치로 이동한다는 의미이기도 합니다. 키가 없는 해시에 초기 문자열을 전달한다고 생각하여 키가 있는 해시에 단일 인수를 전달하는 혼동이 발생할 수 있지만, 이러한 잠재적 오류를 피하기 위해 키가 있는 해시의 인터페이스를 더 모호하게 만들 만한 가치는 없어 보입니다.

버전 1.0에서 버전 2.0으로의 변경 사항

암호화 해시 함수용 API 버전 2.0은 API의 일부 측면을 명확히 하고 최신 상태로 갱신합니다. 또한 이미 사실상 표준으로 자리 잡아 대부분의 구현에서 제공되던 측면들을 공식화했습니다.

버전 2.0은 다음과 같은 새로운 속성을 도입합니다:

name
name 속성은 issue 18532에 의해 필수 항목이 되었습니다.
block_size
새 버전은 또한 반환값 NotImplemented가 HMAC 지원을 막는다는 것을 명시합니다.

버전 2.0은 파이썬 3.0에서의 이진 데이터와 텍스트 데이터의 분리를 고려합니다. new()update()에 대한 ‘string’ 인자뿐만 아니라 ‘key’ 인자도 바이트열과 유사한 객체여야 합니다. 파이썬 2.x에서는 해싱 객체가 ASCII 전용 유니코드도 지원할 수 있습니다. 인자의 실제 이름은 공개 API의 일부이므로 변경되지 않습니다. 코드는 해당 인자가 ‘string’이라고 불린다는 사실에 의존할 수 있습니다.

일반적인 해싱 알고리즘에 권장되는 이름

algorithm variant recommended name
MD5 md5
RIPEMD-160 ripemd160
SHA-1 sha1
SHA-2 SHA-224 sha224
SHA-256 sha256
SHA-384 sha384
SHA-512 sha512
SHA-3 SHA-3-224 sha3_224
SHA-3-256 sha3_256
SHA-3-384 sha3_384
SHA-3-512 sha3_512
WHIRLPOOL whirlpool

변경 사항

  • 2001-09-17: clear()reset()으로 이름 변경; 객체에 digest_size 속성 추가; .hexdigest() 메서드 추가.
  • 2001-09-20: reset() 메서드를 완전히 제거.
  • 2001-09-28: 가변 크기 해시에 대해 digest_sizeNone으로 설정.
  • 2013-08-15: block_sizename 속성 추가; ‘string’이 실제로는 바이트열과 유사한 객체를 가리킨다는 점을 명확히 함.

감사의 말

이 PEP에 대한 의견을 주신 Aahz, Andrew Archibald, Rich Salz, Itamar Shtull-Trauring, 그리고 python-crypto 메일링 리스트 독자들에게 감사드립니다.