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

Python 개선 제안 한국어 번역

PEP 247 – 암호화 해시 함수를 위한 API

Author:
A.M. Kuchling <amk at amk.ca>
Status:
Final
Type:
Informational
Created:
23-Mar-2001
Post-History:
20-Sep-2001

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 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() 메서드를 호출하여 언제든 해시 값을 얻을 수 있습니다.

이 함수에는 임의의 추가 키워드 인자를 더할 수 있지만, 제공되지 않을 경우 합리적인 기본값을 사용해야 합니다. 예를 들어, 가변적인 라운드 수와 여러 가지 출력 크기를 지원하는 해시 함수에는 roundsdigest_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는 128비트 알고리즘이지 16바이트 알고리즘이 아닙니다. 이는 제가 살펴본 샘플 코드에서, 바이트 단위 길이는 자주 필요한 반면(파일 안에서 앞뒤로 이동하거나 출력 문자열의 길이를 계산하기 위해) 비트 단위 길이는 거의 사용되지 않기 때문입니다. 따라서 그 부담은 실제로 비트 단위 크기가 필요한 소수의 사람들에게 돌아가며, 이들은 digest_size에 8을 곱해야 합니다.

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

키 기반 해시의 생성자 인자 순서는 까다로운 문제였습니다. key가 먼저 와야 할지 나중에 와야 할지 명확하지 않았습니다. 이는 필수 매개변수이며, 보통의 관례는 필수 매개변수를 먼저 두는 것이지만, 그렇게 하면 string 매개변수가 첫 번째 위치에서 두 번째 위치로 옮겨가게 됩니다. 키 없는 해시에 초기 문자열을 전달한다고 착각하여 키 기반 해시에 단일 인자를 전달하는 실수를 할 가능성이 있지만, 이러한 잠재적 오류를 피하기 위해 키 기반 해시의 인터페이스를 더 모호하게 만들 만한 가치는 없어 보입니다.

변경 사항

2001-09-17: clear()reset()으로 이름을 변경했습니다. 객체에 digest_size 속성을 추가했습니다. .hexdigest() 메서드를 추가했습니다.

2001-09-20: reset() 메서드를 완전히 제거했습니다.

2001-09-28: 가변 크기 해시의 경우 digest_sizeNone으로 설정했습니다.

감사의 말

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