Python

base64 — Base16, Base32, Base64, Base85 데이터 인코딩

소스 코드: Lib/base64.py


이 모듈은 바이너리 데이터를 인쇄 가능한 ASCII 문자로 인코딩하고, 그러한 인코딩을 다시 바이너리 데이터로 디코딩하는 함수를 제공합니다. 여기에는 encodings specified in 에 명시된 RFC 4648 (Base64, Base32 및 Base16), PDF 2.0 에 정의된 Base85 encoding, 그리고 다른 곳에서 사용되는 비표준 변종의 Base85가 포함됩니다.

이 모듈은 두 개의 인터페이스를 제공합니다. 최신 인터페이스는 바이트열류 객체를 ASCII bytes로 인코딩하고, 바이트열류 객체나 ASCII를 포함하는 문자열을 bytes로 디코딩하는 것을 지원합니다. RFC 4648에 정의된 두 가지(일반, 그리고 URL과 파일 시스템에서 안전한) base-64 알파벳이 모두 지원됩니다.

legacy interface 는 문자열로부터의 디코딩을 지원하지 않지만, file objects 로의 인코딩 및 디코딩 기능은 제공합니다. 이 인터페이스는 Base64 표준 알파벳만 지원하며, RFC 2045 에 따라 76자마다 줄 바꿈을 추가합니다. 만약 RFC 2045 지원을 찾고 있다면 대신 email 패키지를 확인하는 것이 좋습니다.

버전 3.3에서 변경: ASCII 전용 유니코드 문자열은 이제 최신 인터페이스의 디코딩 함수가 받아들입니다.

버전 3.4에서 변경: 모든 바이트열류 객체는 이제 이 모듈의 모든 인코딩과 디코딩 함수가 받아들입니다. Ascii85/Base85 지원이 추가되었습니다.

RFC 4648 인코딩

RFC 4648 인코딩은 바이너리 데이터를 이메일로 안전하게 전송하거나, URL의 일부로 사용하거나, HTTP POST 요청에 포함하기에 적합합니다.

base64.b64encode(s, altchars=None, *, padded=True, wrapcol=0)

Base64를 사용하여 바이트열류 객체 s를 인코딩하고 인코딩된 bytes를 반환합니다.

선택적 altchars+/ 문자의 대체 알파벳을 지정하는 길이 2의 바이트열류 객체여야 합니다. 이를 통해 응용 프로그램은 URL이나 파일 시스템에서 안전한 Base64 문자열을 생성할 수 있습니다. 기본값은 None이며, 표준 Base64 알파벳이 사용됩니다.

padded 이 참인 경우(기본값), 인코딩된 데이터를 ‘=’ 문자로 채워 크기를 4의 배수로 맞춥니다. padded 가 거짓이면 패딩 문자를 추가하지 않습니다.

wrapcol 이 0이 아닌 경우, 최대 wrapcol 문자마다 줄 바꿈(b'\n') 문자를 삽입합니다. wrapcol 이 0인 경우(기본값)는 줄 바꿈을 삽입하지 않습니다.

버전 3.15에서 변경: padded*와 *wrapcol 매개변수가 추가되었습니다.

base64.b64decode(s, altchars=None, validate=False, *, padded=True, canonical=False)
base64.b64decode(s, altchars=None, validate=True, *, ignorechars, padded=True, canonical=False)

Base64로 인코딩된 바이트열류 객체나 ASCII 문자열 s를 디코딩하고 디코딩된 bytes를 반환합니다.

선택적 altchars+/ 문자 대신에 사용되는 대체 알파벳을 지정하는 길이 2의 바이트열류 객체나 ASCII 문자열이어야 합니다.

padded 이 참(true)인 경우, 마지막 4개의 base64 알파벳 그룹은 ‘=’ 문자로 채워져야 합니다. padded 가 거짓(false)인 경우, 패딩은 필요하지 않으며 인식되지도 않습니다. 즉, ‘=’ 문자는 패딩으로 취급되지 않고 비알파벳 문자로 처리됩니다. 이는 validate 가 거짓일 때 무시되며, validate 가 참이고 ignorechars 에 b’=’이 포함되어 있지 않은 경우 Error 를 발생시킵니다.

s가 잘못 채워지면(padded) binascii.Error 예외가 발생합니다.

ignorechars 가 지정된 경우, validate 가 참일 때 입력에서 무시할 문자를 포함하는 bytes-like object 여야 합니다. ignorechars 에 패딩 문자인 '=' 이 포함되어 있으면 인코딩된 데이터 끝부분 앞에 나오는 패딩 문자들과 초과된 패딩 문자가 무시됩니다. validate 의 기본값은 ignorechars 가 지정되면 True, 그렇지 않으면 False 입니다.

validate 가 거짓인 경우, 일반 base-64 알파벳도 아니고 (만약 ignorechars 가 지정되지 않은 경우) 대체 알파벳도 아닌 문자는 패딩 검사 전에 버려집니다. 단, +/ 문자는 altchars 에 포함되지 않는 한 원래의 의미를 유지합니다(향후 파이썬 버전에서는 이들 또한 버려질 예정입니다).

validate 가 참인 경우, 입력에 포함된 이러한 비알파벳 문자들은 binascii.Error 를 발생시킵니다.

canonical 이 참인 경우, 0이 아닌 패딩 비트가 포함된 경우 거부됩니다. 자세한 내용은 binascii.a2b_base64() 를 참조하십시오.

엄격한 base64 검사에 대한 자세한 정보는 binascii.a2b_base64() 를 참조하십시오.

버전 3.15에서 변경: canonical, ignorechars, padded 매개변수가 추가되었습니다.

버전 3.15부터 폐지됨: 대체 알파벳과 함께 +/ 문자를 허용하는 기능이 이제 폐지(deprecated)되었습니다.

base64.standard_b64encode(s)

표준 Base64 알파벳을 사용하여 바이트열류 객체 s를 인코딩하고 인코딩된 bytes를 반환합니다.

base64.standard_b64decode(s)

표준 Base64 알파벳을 사용하여 바이트열류 객체나 ASCII 문자열 s를 디코딩하고 디코딩된 bytes를 반환합니다.

base64.urlsafe_b64encode(s, *, padded=True)

표준 Base64 알파벳에서 +- 로, /_ 로 대체한 URL 및 파일 시스템 안전 알파벳을 사용하여 bytes-like object s 를 인코딩하고 인코딩된 bytes 를 반환합니다. padded 가 참(기본값)인 경우 결과에 여전히 = 이 포함될 수 있습니다.

버전 3.15에서 변경: padded 매개변수가 추가되었습니다.

base64.urlsafe_b64decode(s, *, padded=False)

표준 Base64 알파벳에서 + 대신 -를, / 대신 _를 사용하도록 대체한 URL과 파일 시스템에서 안전한 알파벳을 사용하여 바이트열류 객체나 ASCII 문자열 s를 디코딩하고, 디코딩된 bytes를 반환합니다.

버전 3.15에서 변경: padded 매개변수가 추가되었습니다. 이제 기본값으로 입력의 패딩이 요구되지 않습니다.

버전 3.15부터 폐지됨: +/ 문자를 허용하는 기능이 이제 폐지(deprecated)되었습니다.

base64.b32encode(s, *, padded=True, wrapcol=0)

Base32를 사용하여 바이트열류 객체 s를 인코딩하고 인코딩된 bytes를 반환합니다.

padded 이 true(기본값)이면 인코딩된 데이터를 ‘=’ 문자로 채워 크기를 8의 배수로 맞춥니다. padded 가 false이면 패딩 문자를 추가하지 않습니다.

wrapcol 이 0이 아니면 최대 wrapcol 문자마다 줄 바꿈(b'\n') 문자를 삽입합니다. wrapcol 이 0(기본값)인 경우 줄 바꿈을 추가하지 않습니다.

버전 3.15에서 변경: padded*와 *wrapcol 매개변수가 추가되었습니다.

base64.b32decode(s, casefold=False, map01=None, *, padded=True, ignorechars=b'', canonical=False)

Base32로 인코딩된 바이트열류 객체나 ASCII 문자열 s를 디코딩하고 디코딩된 bytes를 반환합니다.

선택적 casefold는 소문자 알파벳을 입력으로 사용할 수 있는지를 지정하는 플래그입니다. 보안을 위해, 기본값은 False입니다.

RFC 4648은 숫자 0(영)을 글자 O(오)로 선택적으로 매핑하고, 숫자 1(일)을 글자 I(아이)나 글자 L(엘)로 선택적으로 매핑할 수 있게 합니다. 선택적 인자 map01None이 아니면, 숫자 1이 매핑되어야 하는 글자를 지정합니다 (map01None이 아닐 때, 숫자 0은 항상 글자 O로 매핑됩니다). 보안상의 이유로 기본값은 None이고, 0과 1은 입력에 허용되지 않습니다.

padded 이 참인 경우, 마지막 8개의 base 32 알파벳 그룹은 ‘=’ 문자로 채워져야 합니다. padded 가 거짓인 경우 패딩은 필요하지도 않고 인식되지도 않습니다. 즉, ‘=’ 문자는 패딩으로 취급되지 않고 비알파벳 문자로 처리되므로, ignorechars 에 b’=’이 포함되어 있지 않은 경우 binascii.Error 를 발생시킵니다.

ignorechars 는 입력에서 무시할 문자를 포함하는 bytes-like object 여야 합니다.

canonical 이 참인 경우, 0이 아닌 패딩 비트가 포함된 경우 거부됩니다. 자세한 내용은 binascii.a2b_base32() 를 참조하십시오.

s가 잘못 채워졌거나(padded) 입력에 알파벳이 아닌 문자가 있으면 binascii.Error가 발생합니다.

버전 3.15에서 변경: canonical, ignorechars, padded 매개변수가 추가되었습니다.

base64.b32hexencode(s, *, padded=True, wrapcol=0)

b32encode() 와 유사하지만 RFC 4648 에 정의된 확장 16진수 알파벳(Extended Hex Alphabet)을 사용합니다.

Added in version 3.10.

버전 3.15에서 변경: padded*와 *wrapcol 매개변수가 추가되었습니다.

base64.b32hexdecode(s, casefold=False, *, padded=True, ignorechars=b'', canonical=False)

b32decode() 와 유사하지만 RFC 4648 에 정의된 확장 16진수 알파벳(Extended Hex Alphabet)을 사용합니다.

이 버전에서는 숫자 0(zero)을 문자 O(oh)로 매핑하거나, 숫자 1(one)을 문자 I(eye) 또는 L(el)로 매핑하는 것을 허용하지 않습니다. 이 모든 문자는 확장 헥사 알파벳(Extended Hex Alphabet)에 포함되어 있으며 서로 교체 가능하지 않습니다.

Added in version 3.10.

버전 3.15에서 변경: canonical, ignorechars, padded 매개변수가 추가되었습니다.

base64.b16encode(s, *, wrapcol=0)

Base16을 사용하여 바이트열류 객체 s를 인코딩하고 인코딩된 bytes를 반환합니다.

wrapcol 이 0이 아니면 최대 wrapcol 문자마다 줄 바꿈(b'\n') 문자를 삽입합니다. wrapcol 이 0(기본값)인 경우 줄 바꿈을 추가하지 않습니다.

버전 3.15에서 변경: wrapcol 매개 변수가 추가되었습니다.

base64.b16decode(s, casefold=False, *, ignorechars=b'')

Base16으로 인코딩된 바이트열류 객체나 ASCII 문자열 s를 디코딩하고 디코딩된 bytes를 반환합니다.

선택적 casefold는 소문자 알파벳을 입력으로 사용할 수 있는지를 지정하는 플래그입니다. 보안을 위해, 기본값은 False입니다.

ignorechars 는 입력에서 무시할 문자를 포함하는 bytes-like object 여야 합니다.

s가 잘못 채워졌거나(padded) 입력에 알파벳이 아닌 문자가 있으면 binascii.Error가 발생합니다.

버전 3.15에서 변경: ignorechars 매개변수가 추가되었습니다.

Base85 인코딩

Base85 인코딩은 5개의 ASCII 문자를 사용하여 4바이트를 표현하는 알고리즘군입니다. 원래 Unix의 btoa(1) 유틸리티에 구현되었으며, 이후 Adobe가 PostScript 언어에서 채택한 버전이 PDF 2.0(ISO 32000-2)으로 표준화되었습니다. btoa 및 PDF 변형 모두 이 버전은 a85encode() 로 구현됩니다.

다른 출력 문자 집합을 사용하는 별도의 버전이 RFC 1924 에서 만우절 농담으로 정의되었으나, 현재는 Git 및 기타 소프트웨어에서 사용되고 있습니다. 이 버전은 b85encode() 로 구현됩니다.

마지막으로, 프로그래밍 언어 문자열에 안전하게 포함되도록 설계된 또 다른 출력 문자 집합을 사용하는 세 번째 버전이 ZeroMQ에 의해 정의되었으며, 여기서는 z85encode() 로 구현됩니다.

이 모듈에 포함된 함수들은 다음 사항들을 처리하는 방식에서 차이가 있습니다:

  • 닫는 표시인 <~~> 마커를 포함하고 기대하는지 여부.

  • 입력을 여러 줄로 폴딩할지 여부.

  • 인코딩에 사용되는 ASCII 문자 집합.

  • 공백 및 널 바이트 시퀀스의 압축된 인코딩.

  • 입력에 적용된 제로 패딩(zero-padding) 바이트의 인코딩.

자세한 내용은 개별 함수의 문서를 참조하십시오.

base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

Ascii85를 사용하여 바이트열류 객체 b를 인코딩하고 인코딩된 bytes를 반환합니다.

foldspaces 는 ‘btoa’가 지원하는 것과 같이, 4개의 연속된 공백(ASCII 0x20) 대신 특수한 짧은 시퀀스 ‘y’를 사용하는 선택적 플래그입니다. 이 기능은 PDF에서 사용되는 표준 인코딩에서는 지원되지 않습니다.

wrapcol 이 0이 아닌 경우, 최대 wrapcol 문자마다 줄 바꿈(b'\n') 문자를 삽입합니다. wrapcol 이 0인 경우(기본값)는 줄 바꿈을 삽입하지 않습니다.

padbtoa 와 같이 입력 끝에 적용된 제로 패딩이 출력 인코딩에서 완전히 유지되어 결과가 정확히 5바이트의 배수가 되도록 할지 여부를 제어합니다. 이는 데이터의 길이를 보존하지 않으므로 PDF에서 사용되는 표준 인코딩의 일부가 아닙니다.

adobe 는 인코딩된 바이트 시퀀스가 PostScript base-85 문자열 리터럴과 같이 <~~> 로 프레임화되는지 여부를 제어합니다. PDF 문서의 ASCII85Decode 스트림은 반드시 ~> 로 끝나야 하지만, 앞부분에 <~ 를 사용해서는 안 된다는 점에 유의하십시오.

Added in version 3.4.

base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b', canonical=False)

Ascii85로 인코딩된 바이트열류 객체나 ASCII 문자열 b를 디코딩하고 디코딩된 bytes를 반환합니다.

foldspaces 는 짧은 시퀀스 ‘y’를 4개의 연속된 공백(ASCII 0x20)의 축약형으로 허용할지 여부를 지정하는 플래그입니다. 이 기능은 PDF 및 PostScript에서 사용되는 표준 Ascii85 인코딩에서는 지원되지 않습니다.

adobe<~~> 마커가 존재하는지 여부를 제어합니다. 앞부분의 <~ 는 필수 사항이 아니지만, 입력은 반드시 ~> 로 끝나야 하며 그렇지 않으면 ValueError 가 발생합니다.

ignorechars should be a bytes-like object containing characters to ignore from the input. This should only contain whitespace characters, and by default contains all whitespace characters in ASCII.

canonical 이 참이면 비정형(non-canonical) 인코딩은 거부됩니다. 자세한 내용은 binascii.a2b_ascii85() 를 참조하십시오.

Added in version 3.4.

버전 3.15에서 변경: canonical 매개 변수가 추가되었습니다. 단일 문자로 구성된 마지막 그룹은 이제 항상 인코딩 위반으로 거부됩니다.

base64.b85encode(b, pad=False, *, wrapcol=0)

base85를 사용하여 바이트열류 객체 b를 인코딩하고 (예를 들어 git 스타일 바이너리 diff에서 사용되는 것처럼), 인코딩된 bytes를 반환합니다.

입력은 b'\0' 으로 채워져 인코딩 전에 길이가 4바이트의 배수가 됩니다. pad 가 참이면 결과로 생성된 모든 문자가 출력에 유지되며, 이는 항상 5바이트의 배수가 되므로 디코딩 시 데이터의 길이가 유지되지 않을 수 있습니다.

wrapcol 이 0이 아니면 최대 wrapcol 문자마다 줄 바꿈(b'\n') 문자를 삽입합니다. wrapcol 이 0(기본값)인 경우 줄 바꿈을 추가하지 않습니다.

Added in version 3.4.

버전 3.15에서 변경: wrapcol 매개 변수가 추가되었습니다.

base64.b85decode(b, *, ignorechars=b'', canonical=False)

바이트열류 객체\나 ASCII 문자열 b\를 base85로 인코딩된 내용을 디코딩하고 디코딩된 bytes\를 반환합니다.

ignorechars 는 입력에서 무시할 문자를 포함하는 bytes-like object 여야 합니다.

canonical 이 참이면 비정형(non-canonical) 인코딩은 거부됩니다. 자세한 내용은 binascii.a2b_base85() 를 참조하십시오.

Added in version 3.4.

버전 3.15에서 변경: canonicalignorechars 매개 변수가 추가되었습니다. 단일 문자로 구성된 마지막 그룹은 이제 항상 인코딩 위반으로 거부됩니다.

base64.z85encode(s, pad=False, *, wrapcol=0)

바이트열류 객체 s\를 Z85 (ZeroMQ 에서 사용됨)를 사용하여 인코딩하고, 인코딩된 bytes\를 반환합니다. 더 자세한 내용은 Z85 명세\를 참조하십시오.

입력은 b'\0' 으로 채워져 인코딩 전 길이가 4바이트의 배수가 됩니다. pad 가 참이면 모든 결과 문자가 출력에 유지되며, 이는 ZeroMQ 표준에 따라 항상 5바이트의 배수가 됩니다.

wrapcol 이 0이 아니면 최대 wrapcol 문자마다 줄 바꿈(b'\n') 문자를 삽입합니다. wrapcol 이 0(기본값)인 경우 줄 바꿈을 추가하지 않습니다.

Added in version 3.13.

버전 3.15에서 변경: pad 매개 변수가 추가되었습니다.

버전 3.15에서 변경: wrapcol 매개 변수가 추가되었습니다.

base64.z85decode(s, *, ignorechars=b'', canonical=False)

Z85로 인코딩된 바이트열류 객체\나 ASCII 문자열 s\를 디코딩하고 디코딩된 bytes\를 반환합니다. 더 자세한 내용은 Z85 명세\를 참조하십시오.

ignorechars 는 입력에서 무시할 문자를 포함하는 bytes-like object 여야 합니다.

canonical 이 참이면 비정형(non-canonical) 인코딩은 거부됩니다. 자세한 내용은 binascii.a2b_base85() 를 참조하십시오.

Added in version 3.13.

버전 3.15에서 변경: canonicalignorechars 매개 변수가 추가되었습니다. 단일 문자로 구성된 마지막 그룹은 이제 항상 인코딩 위반으로 거부됩니다.

레거시 인터페이스

base64.decode(input, output)

바이너리 input 파일의 내용을 디코딩하고 결과 바이너리 데이터를 output 파일에 씁니다. inputoutput파일 객체여야 합니다. inputinput.readline()이 빈 바이트열 객체를 반환할 때까지 읽힙니다.

base64.decodebytes(s)

하나 이상의 base64 인코딩된 데이터 줄을 포함해야 하는 바이트열류 객체 s를 디코딩하고 디코딩된 bytes를 반환합니다.

Added in version 3.1.

base64.encode(input, output)

바이너리 input 파일의 내용을 인코딩하고 base64로 인코딩된 결과 데이터를 output 파일에 씁니다. inputoutput파일 객체여야 합니다. inputinput.read()이 빈 바이트열 객체를 반환할 때까지 읽힙니다. encode()RFC 2045(MIME)에 따라 출력의 76바이트마다 개행 문자(b'\n')를 삽입할 뿐만 아니라, 항상 출력이 개행 문자로 끝나도록 합니다.

base64.encodebytes(s)

임의의 바이너리 데이터를 포함할 수 있는 바이트열류 객체 s를 인코딩하고, RFC 2045 (MIME)에 따라 76바이트의 출력마다 개행(b'\n')이 삽입되고, 후행 개행이 붙은 base64 인코딩된 데이터를 포함하는 bytes를 반환합니다.

Added in version 3.1.

모듈 사용 예:

>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'

보안 고려 사항

RFC 4648 에 새로운 보안 고려 사항 섹션(섹션 12)이 추가되었습니다. 운영 환경에 배포되는 모든 코드에 대해 보안 섹션을 검토할 것을 권장합니다.

더 보기

모듈 binascii

ASCII에서 바이너리로, 바이너리에서 ASCII로의 변환이 포함된 지원 모듈.

RFC 1521 - MIME (Multipurpose Internet Mail Extensions) Part One: Mechanisms for Specifying and Describing the Format of Internet Message Bodies

5.2 절, “Base64 Content-Transfer-Encoding” 은 base64 인코딩의 정의를 제공합니다.

ISO 32000-2 Portable document format - Part 2: PDF 2.0

섹션 7.4.3, “ASCII85Decode Filter”는 출력 문자 집합과 제로 패딩 및 부분 출력 그룹을 사용한 데이터 길이 보존에 대한 세부 정보를 포함하여 PDF 및 PostScript에서 사용되는 Ascii85 인코딩의 정의를 제공합니다.

ZeroMQ RFC 32/Z85

“Formal Specification” 섹션은 Z85에서 사용되는 문자 집합을 제공합니다.

분실물 보관소