[Final] PEP 247 - API for Cryptographic Hash Functions
원문 링크: PEP 247 - API for Cryptographic Hash Functions
상태: Final 유형: Informational 작성일: 23-Mar-2001
PEP 247 – 암호화 해시 함수용 API
개요
이 문서는 MD5 또는 SHA와 같은 암호화 해싱 알고리즘을 구현하는 다양한 모듈들을 위해 표준화된 API를 정의합니다. 이를 통해 여러 구현체 간의 전환을 용이하게 하는 것을 목표로 합니다.
사양 (Specification)
모든 해싱 모듈은 동일한 인터페이스를 제공해야 합니다. 추가적인 메서드나 변수를 포함할 수 있지만, 이 문서에 명시된 항목들은 항상 존재해야 합니다.
해시 함수 모듈이 정의하는 함수
new([string])
(키가 없는(unkeyed) 해시)new([key], [string])
(키가 있는(keyed) 해시)
새로운 해싱 객체를 생성하고 반환합니다. 첫 번째 형식은 MD5나 SHA처럼 키가 없는 해시에 사용됩니다. HMAC와 같은 키가 있는 해시의 경우, key
는 사용할 키를 담은 문자열을 필수로 받습니다. 두 경우 모두, 선택적 string
파라미터가 제공되면, 마치 obj.update(string)
이 호출된 것처럼 객체의 초기 상태에 즉시 해시됩니다.
해싱 객체 생성 후, update()
메서드를 사용하여 임의의 문자열을 객체에 공급할 수 있으며, digest()
메서드를 호출하여 언제든지 해시 값을 얻을 수 있습니다.
이 함수에 임의의 추가 키워드 인수를 추가할 수 있지만, 제공되지 않은 경우 합리적인 기본값이 사용되어야 합니다. 예를 들어, 가변 라운드 수와 여러 출력 크기를 지원하는 해시 함수에는 rounds
및 digest_size
키워드를 추가할 수 있으며, 이들은 안전하다고 여겨지는 값으로 기본 설정되어야 합니다.
해시 함수 모듈이 정의하는 변수
digest_size
정수 값으로, 이 모듈이 생성하는 해싱 객체에 의해 생성되는 다이제스트(digest)의 크기를 바이트 단위로 나타냅니다. 샘플 객체를 생성하고 해당 digest_size
속성에 접근하여 이 값을 얻을 수도 있지만, 모듈에서 바로 이 값을 사용할 수 있도록 하는 것이 편리합니다. 출력 크기가 가변적인 해시는 이 변수를 None
으로 설정합니다.
해싱 객체가 요구하는 속성
digest_size
이 속성은 모듈 수준의 digest_size
변수와 동일하며, 해싱 객체에 의해 생성되는 다이제스트의 크기를 바이트 단위로 측정합니다. 해시가 가변 출력 크기를 갖는 경우, 이 출력 크기는 해싱 객체가 생성될 때 선택되어야 하며, 이 속성에는 선택된 크기가 포함되어야 합니다. 따라서 None
은 이 속성의 유효한 값이 아닙니다.
해싱 객체가 요구하는 메서드
-
copy()
이 해싱 객체의 별도 사본을 반환합니다. 이 사본에 대한 업데이트는 원본 객체에 영향을 주지 않습니다. -
digest()
이 해싱 객체의 해시 값을 8비트 데이터를 포함하는 문자열로 반환합니다. 이 함수에 의해 객체는 어떤 식으로든 변경되지 않습니다. 이 함수를 호출한 후에도 객체를 계속 업데이트할 수 있습니다. -
hexdigest()
이 해싱 객체의 해시 값을 16진수 숫자를 포함하는 문자열로 반환합니다.a
부터f
까지의 숫자에 대해 소문자가 사용되어야 합니다..digest()
메서드와 마찬가지로, 이 메서드는 객체를 변경해서는 안 됩니다. -
update(string)
string
을 해싱 객체의 현재 상태로 해시합니다.update()
는 해싱 객체의 수명 동안 여러 번 호출될 수 있습니다.
해싱 모듈은 추가적인 모듈 수준 함수나 객체 메서드를 정의할 수 있으며, 여전히 이 사양을 준수합니다.
예시:
>>> from Crypto.Hash import MD5
>>> m = MD5.new()
>>> m.digest_size
16
>>> m.update('abc')
>>> m.digest()
'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
>>> m.hexdigest()
'900150983cd24fb0d6963f7d28e17f72'
>>> MD5.new('abc').digest()
'\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr'
근거 (Rationale)
다이제스트(digest) 크기는 해시 알고리즘의 크기가 일반적으로 비트 단위로 인용됨에도 불구하고 바이트 단위로 측정됩니다. 예를 들어, MD5는 128비트 알고리즘이지 16바이트 알고리즘이 아닙니다. 이는 검토된 샘플 코드에서 바이트 길이가 종종 필요하고(파일에서 앞뒤로 탐색, 출력 문자열 길이 계산 등), 비트 길이는 거의 사용되지 않기 때문입니다. 따라서, 비트 단위 크기가 실제로 필요한 소수의 사람들에게 digest_size
에 8을 곱하는 부담이 주어질 것입니다.
update()
메서드가 append()
로 이름이 바뀌는 것이 더 낫다는 제안이 있었습니다. 그러나 이 메서드는 실제로 해싱 객체의 현재 상태를 업데이트하는 것이며, update()
는 이미 Python에 포함된 md5
및 sha
모듈에서 사용되고 있으므로, update()
이름을 그대로 두는 것이 가장 간단하다고 판단되었습니다.
키가 있는 해시(keyed hashes)의 생성자 인자 순서는 까다로운 문제였습니다. key
가 먼저 와야 할지 두 번째로 와야 할지 명확하지 않았습니다. key
는 필수 매개변수이며, 일반적인 관례는 필수 매개변수를 먼저 배치하는 것이지만, 이는 string
매개변수가 첫 번째 위치에서 두 번째 위치로 이동하는 것을 의미하기도 합니다. 혼동하여 단일 인자를 키가 있는 해시에 전달하면서, 키가 없는 해시에 초기 문자열을 전달한다고 생각할 수도 있지만, 이러한 잠재적 오류를 피하기 위해 키가 있는 해시의 인터페이스를 더 모호하게 만들 가치는 없는 것으로 보입니다.
변경사항 (Changes)
- 2001-09-17:
clear()
가reset()
으로 이름이 변경되었고, 객체에digest_size
속성이 추가되었으며,.hexdigest()
메서드가 추가되었습니다. - 2001-09-20:
reset()
메서드가 완전히 제거되었습니다. - 2001-09-28: 가변 크기 해시의 경우
digest_size
가None
으로 설정되었습니다.
⚠️ 알림: 이 문서는 AI를 활용하여 번역되었으며, 기술적 정확성을 보장하지 않습니다. 정확한 내용은 반드시 원문을 확인하시기 바랍니다.
Comments