PEP 247 – 암호화 해시 함수를 위한 API
- Author:
- A.M. Kuchling <amk at amk.ca>
- Status:
- Final
- Type:
- Informational
- Created:
- 23-Mar-2001
- Post-History:
- 20-Sep-2001
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
초록
MD5나 SHA 같은 암호화 해시 알고리즘을 구현하는 여러 모듈이 있습니다. 이 문서는 서로 다른 구현 간의 전환을 쉽게 하기 위해 이러한 알고리즘을 위한 표준 API를 명세합니다.
명세
모든 해시 모듈은 동일한 인터페이스를 제공해야 합니다. 추가 메서드나 변수를 더할 수는 있지만, 이 문서에서 설명하는 것들은 항상 존재해야 합니다.
해시 함수 모듈은 하나의 함수를 정의합니다:
new([string]) (unkeyed hashes)new([key] , [string]) (keyed hashes)새 해시 객체를 생성하여 반환합니다. 첫 번째 형식은 MD5나 SHA처럼 키가 없는 해시를 위한 것입니다. HMAC처럼 키가 있는 해시의 경우, key는 사용할 키를 나타내는 문자열을 담는 필수 매개변수입니다. 두 경우 모두, 선택적인 문자열 매개변수 string이 주어지면,obj.update(string)을 호출한 것처럼 즉시 객체의 초기 상태에 해시됩니다.해시 객체를 생성한 후에는 객체의
update()메서드를 사용하여 임의의 문자열을 객체에 입력할 수 있으며, 언제든지 객체의digest()메서드를 호출하여 해시 값을 얻을 수 있습니다.이 함수에는 임의의 추가 키워드 인자를 더할 수 있지만, 해당 인자가 주어지지 않으면 합리적인 기본값을 사용해야 합니다. 예를 들어, 가변 라운드 수와 여러 가지 출력 크기를 지원하는 해시 함수에는
rounds와digest_size키워드를 추가할 수 있으며, 이들의 기본값은 안전하다고 여겨지는 값이어야 합니다.
해시 함수 모듈은 하나의 변수를 정의합니다:
digest_size정수 값으로, 이 모듈이 생성하는 해싱 객체가 만들어 내는 다이제스트의 크기를 바이트 단위로 나타냅니다. 샘플 객체를 생성하여 그digest_size속성에 접근해서도 이 값을 얻을 수 있지만, 모듈에서 이 값을 바로 얻을 수 있으면 편리할 수 있습니다. 출력 크기가 가변적인 해시는 이 변수를None으로 설정합니다.
해시 객체에는 하나의 속성이 필요합니다:
digest_size이 속성은 모듈 수준의digest_size변수와 동일하며, 해시 객체가 만들어 내는 다이제스트의 크기를 바이트 단위로 나타냅니다. 해시의 출력 크기가 가변적이라면 해시 객체를 생성할 때 출력 크기를 선택해야 하며, 이 속성에는 선택된 크기가 들어 있어야 합니다. 따라서None은 이 속성에 유효한 값이 아닙니다.
해시 객체에는 다음 메서드들이 필요합니다:
copy()이 해시 객체의 독립된 사본을 반환합니다. 이 사본을 갱신해도 원래 객체에는 영향을 미치지 않습니다.
digest()이 해시 객체의 해시 값을 8비트 데이터를 담은 문자열로 반환합니다. 이 함수는 객체를 어떤 식으로도 변경하지 않으므로, 이 함수를 호출한 후에도 객체를 계속 갱신할 수 있습니다.
hexdigest()이 해시 객체의 해시 값을 16진수 숫자로 이루어진 문자열로 반환합니다.a부터f까지의 숫자에는 소문자를 사용해야 합니다..digest()메서드와 마찬가지로, 이 메서드는 객체를 변경해서는 안 됩니다.
update(string)문자열 string을 해싱 객체의 현재 상태에 해시합니다.update()는 해싱 객체의 수명 동안 몇 번이든 호출할 수 있습니다.
해싱 모듈은 모듈 수준 함수나 객체 메서드를 추가로 정의하더라도 이 명세를 준수할 수 있습니다.
다음은 MD5라는 이름의 모듈을 사용한 예입니다:
>>> 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'
근거
해시 알고리즘의 크기는 보통 비트 단위로 표기하지만, 다이제스트 크기는 비트가 아닌 바이트 단위로 측정합니다. 예를 들어 MD5는 16바이트 알고리즘이 아니라 128비트 알고리즘이라고 합니다. 제가 살펴본 예제 코드에서는 바이트 단위의 길이가 자주 필요했지만(파일에서 앞이나 뒤로 이동하거나 출력 문자열의 길이를 계산하는 경우), 비트 단위의 길이는 거의 쓰이지 않았기 때문입니다. 따라서 그 부담은 비트 단위의 크기가 실제로 필요한 소수의 사람에게 돌아가며, 이들은 digest_size에 8을 곱해야 합니다.
update() 메서드의 이름을 append()로 하는 편이 더 낫겠다는 제안이 있었습니다. 하지만 이 메서드는 실제로 해싱 객체의 현재 상태를 갱신하는 일을 하며, update()는 Python에 포함된 md5 및 sha 모듈에서 이미 사용되고 있으므로, update()라는 이름을 그대로 두는 것이 가장 간단해 보입니다.
키가 있는 해시에서 생성자 인자의 순서는 까다로운 문제였습니다. key가 첫 번째에 와야 할지 두 번째에 와야 할지 분명하지 않았습니다. 이것은 필수 매개변수이며 일반적인 관례는 필수 매개변수를 먼저 두는 것이지만, 그렇게 하면 문자열 매개변수 string이 첫 번째 위치에서 두 번째 위치로 옮겨가게 됩니다. 키가 없는 해시에 초기 문자열을 전달한다고 착각하여 키가 있는 해시에 인자를 하나만 전달하는 실수를 할 수도 있지만, 이런 잠재적인 오류를 피하려고 키가 있는 해시의 인터페이스를 더 모호하게 만들 가치는 없어 보입니다.
변경 사항
2001-09-17: clear()의 이름을 reset()으로 바꿨습니다. 객체에 digest_size 속성을 추가했습니다. .hexdigest() 메서드를 추가했습니다.
2001-09-20: reset() 메서드를 완전히 제거했습니다.
2001-09-28: 가변 크기 해시의 digest_size를 None으로 설정했습니다.
감사의 글
이 PEP에 의견을 주신 Aahz, Andrew Archibald, Rich Salz, Itamar Shtull-Trauring, 그리고 python-crypto 메일링 리스트의 독자 여러분께 감사드립니다.
Copyright
This document has been placed in the public domain.