[PYTHON] Python : Base64 디코딩시 '잘못된 패딩'오류 무시
PYTHONPython : Base64 디코딩시 '잘못된 패딩'오류 무시
나는 거기에 패딩 오류가있는 경우에도 다시 바이너리로 변환하려는 base64로 인코딩 된 일부 데이터가 있습니다. 내가 사용하면
base64.decodestring(b64_string)
'잘못된 패딩'오류가 발생합니다. 다른 방법이 있습니까?
업데이트 : 모든 의견에 감사드립니다. 솔직히 말하면, 언급 된 모든 방법들은 약간의 타격을주었습니다. 그리워서 openssl을 사용해보기로 결심했습니다. 다음 명령은 대우를 수행했습니다.
openssl enc -d -base64 -in b64string -out binary_data
해결법
-
==============================
1.다른 응답에서 말했듯이, base64 데이터가 손상 될 수있는 다양한 방법이 있습니다.
다른 응답에서 말했듯이, base64 데이터가 손상 될 수있는 다양한 방법이 있습니다.
그러나 위키 피 디아 (Wikipedia)에 따르면, 패딩 (base64로 인코딩 된 데이터의 끝에있는 '='문자)을 제거하는 것은 "무손실"입니다.
따라서 이것이 정말로 base64 데이터에서 "잘못된"유일한 것이라면 패딩을 다시 추가 할 수 있습니다. WeasyPrint에서 "데이터"URL을 구문 분석 할 수 있도록하기 위해이 중 하나를 작성했습니다. 그 중 일부는 패딩이없는 base64였습니다.
def decode_base64(data): """Decode base64, padding being optional. :param data: Base64 data as an ASCII byte string :returns: The decoded byte string. """ missing_padding = len(data) % 4 if missing_padding != 0: data += b'='* (4 - missing_padding) return base64.decodestring(data)
이 함수에 대한 테스트 : weasyprint / tests / test_css.py # L68
-
==============================
2.필요한 경우 패딩을 추가하기 만하면됩니다. 그러나 마이클의 경고에 유의하십시오.
필요한 경우 패딩을 추가하기 만하면됩니다. 그러나 마이클의 경고에 유의하십시오.
b64_string += "=" * ((4 - len(b64_string) % 4) % 4) #ugh
-
==============================
3.패딩 오류가 발생하면 문자열이 손상되었다는 의미 일 수 있습니다. base64로 인코딩 된 문자열은 길이가 4의 배수 여야합니다. 패딩 문자 (=)를 직접 추가하여 문자열을 4의 배수로 만들 수는 있지만, 뭔가 잘못되어 있지 않는 한 이미 있어야합니다.
패딩 오류가 발생하면 문자열이 손상되었다는 의미 일 수 있습니다. base64로 인코딩 된 문자열은 길이가 4의 배수 여야합니다. 패딩 문자 (=)를 직접 추가하여 문자열을 4의 배수로 만들 수는 있지만, 뭔가 잘못되어 있지 않는 한 이미 있어야합니다.
-
==============================
4."잘못된 패딩"은 "누락 된 패딩"뿐만 아니라 "잘못된 패딩"을 의미 할 수도 있습니다.
"잘못된 패딩"은 "누락 된 패딩"뿐만 아니라 "잘못된 패딩"을 의미 할 수도 있습니다.
"패딩 추가"방법이 작동하지 않는다고 제안되면 뒤에 오는 바이트를 제거하십시오 :
lens = len(strg) lenx = lens - (lens % 4 if lens % 4 else 4) try: result = base64.decodestring(strg[:lenx]) except etc
업데이트 : 공백을 제거한 후 패딩을 추가하거나 잘못된 바이트를 제거하는 작업을해야합니다. 그렇지 않으면 길이 계산이 화를냅니다.
복구해야하는 데이터의 샘플을 보여 주면 좋습니다. 질문을 편집하고 print repr (sample)의 결과를 복사 / 붙여 넣기하십시오.
업데이트 2 : 인코딩이 URL 안전 방식으로 수행되었을 수 있습니다. 이 경우 데이터에서 마이너스 및 밑줄 문자를 볼 수 있으며 base64.b64decode (strg, '-_')를 사용하여 디코딩 할 수 있어야합니다.
데이터에서 마이너스 및 밑줄 문자를 볼 수 없지만 더하기 및 슬래시 문자를 볼 수있는 경우 다른 문제가 발생하고 추가 패딩이나 제거가 필요합니다.
마이너스, 밑줄, 더하기 및 슬래시가 데이터에서 전혀 보이지 않으면 두 개의 대체 문자를 결정해야합니다. 그들은 [A-Za-z0-9]에없는 것들입니다. 그런 다음 base64.b64decode ()의 두 번째 인수에서 어떤 순서로 사용해야하는지 확인해야합니다.
업데이트 3 : 데이터가 "회사 기밀"인 경우 : (a) 그렇게 말하면 좋겠다. (b) 우리는 문자를 + 및 / 또는 인코딩 알파벳이나 다른 형식 또는 관계없는 문자로 사용하는 것과 관련이있을 가능성이 높은 문제를 이해하는 다른 방법을 모색 할 수 있습니다.
그러한 한 가지 방법은 데이터에 "표준"이 아닌 문자가 있는지 검사하는 것입니다 (예 :
from collections import defaultdict d = defaultdict(int) import string s = set(string.ascii_letters + string.digits) for c in your_data: if c not in s: d[c] += 1 print d
-
==============================
5.용도
용도
string += '=' * (-len(string) % 4) # restore stripped '='s
신용은 여기 어딘가에 코멘트로갑니다.
>>> import base64 >>> enc = base64.b64encode('1') >>> enc >>> 'MQ==' >>> base64.b64decode(enc) >>> '1' >>> enc = enc.rstrip('=') >>> enc >>> 'MQ' >>> base64.b64decode(enc) ... TypeError: Incorrect padding >>> base64.b64decode(enc + '=' * (-len(enc) % 4)) >>> '1' >>>
-
==============================
6.디코딩하려는 데이터 소스의 문서를 확인하십시오. base64.b64decode (s) 대신 base64.urlsafe_b64decode (s)를 사용하는 것이 가능합니까? 그것이이 오류 메시지를 본 이유 중 하나입니다.
디코딩하려는 데이터 소스의 문서를 확인하십시오. base64.b64decode (s) 대신 base64.urlsafe_b64decode (s)를 사용하는 것이 가능합니까? 그것이이 오류 메시지를 본 이유 중 하나입니다.
예를 들어 Google Identity Toolkit 및 Gmail 페이로드와 같은 다양한 Google API의 경우입니다.
-
==============================
7.코멘트 할 담당자는 없지만, 좋은 점은 (적어도 Python 3.x에서는) base64.b64decode가 충분한 여분의 패딩을 잘라 버릴 것이라는 것입니다.
코멘트 할 담당자는 없지만, 좋은 점은 (적어도 Python 3.x에서는) base64.b64decode가 충분한 여분의 패딩을 잘라 버릴 것이라는 것입니다.
따라서, b'abc = '는 b'abc ==와 마찬가지로 잘 작동합니다.
이것이 의미하는 것은 당신이 필요로하는 패딩 문자의 최대 수를 3 개 (b '===')로 추가 할 수 있다는 것입니다. 그리고 base64는 불필요한 것들을 잘라 버릴 것입니다.
기본적으로 base64.b64decode (s + b '===')는 base64.b64decode (s + b '='* (-len (s) % 4)보다 깔끔합니다.
-
==============================
8.패딩을 추가하는 것은 오히려 피싱입니다. 다음은이 스레드의 주석과 base64 용 wiki 페이지 (굉장히 도움이 됨) https://en.wikipedia.org/wiki/Base64#Padding을 통해 작성한 기능입니다.
패딩을 추가하는 것은 오히려 피싱입니다. 다음은이 스레드의 주석과 base64 용 wiki 페이지 (굉장히 도움이 됨) https://en.wikipedia.org/wiki/Base64#Padding을 통해 작성한 기능입니다.
import logging import base64 def base64_decode(s): """Add missing padding to string and return the decoded base64 string.""" log = logging.getLogger() s = str(s).strip() try: return base64.b64decode(s) except TypeError: padding = len(s) % 4 if padding == 1: log.error("Invalid base64 string: {}".format(s)) return '' elif padding == 2: s += b'==' elif padding == 3: s += b'=' return base64.b64decode(s)
-
==============================
9."="또는 다른 문자를 추가하고 대상 문자열 값을 디코딩하기 전에 4의 배수로 만드십시오. 뭔가가 좋아.
"="또는 다른 문자를 추가하고 대상 문자열 값을 디코딩하기 전에 4의 배수로 만드십시오. 뭔가가 좋아.
if len(value) % 4 != 0: #check if multiple of 4 while len(value) % 4 != 0: value = value + "=" req_str = base64.b64decode(value) else: req_str = base64.b64decode(value)
-
==============================
10.이 오류가 웹 서버에서 발생한 경우 : 게시 된 값을 인코딩하는 URL을 사용해보십시오. "curl"을 통해 게시 중이었고 "base64 값을 url로 인코딩하지 않아"+ "같은 문자가 이스케이프되지 않았으므로 웹 서버 url-decode 논리가 자동으로 url-decode를 실행하고 공백으로 변환했습니다.
이 오류가 웹 서버에서 발생한 경우 : 게시 된 값을 인코딩하는 URL을 사용해보십시오. "curl"을 통해 게시 중이었고 "base64 값을 url로 인코딩하지 않아"+ "같은 문자가 이스케이프되지 않았으므로 웹 서버 url-decode 논리가 자동으로 url-decode를 실행하고 공백으로 변환했습니다.
"+"는 유효한 base64 문자이며 예기치 않은 url-decode에 의해 mangled되는 유일한 문자입니다.
-
==============================
11.내 경우에는 전자 메일을 구문 분석하는 동안 그 오류가 발생했습니다. 첨부 파일을 base64 문자열로 가져 와서 re.search를 통해 압축을 풉니 다. 결국 엔 이상한 추가 부분 문자열이 끝에 있습니다.
내 경우에는 전자 메일을 구문 분석하는 동안 그 오류가 발생했습니다. 첨부 파일을 base64 문자열로 가져 와서 re.search를 통해 압축을 풉니 다. 결국 엔 이상한 추가 부분 문자열이 끝에 있습니다.
dHJhaWxlcgo8PCAvU2l6ZSAxNSAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWyhcMDAyXDMz MHtPcFwyNTZbezU/VzheXDM0MXFcMzExKShcMDAyXDMzMHtPcFwyNTZbezU/VzheXDM0MXFcMzEx KV0KPj4Kc3RhcnR4cmVmCjY3MDEKJSVFT0YK --_=ic0008m4wtZ4TqBFd+sXC8--
- _ = ic0008m4wtZ4TqBFd + sXC8 -을 삭제하고 문자열을 제거한 후 구문 분석이 수정되었습니다.
그래서 내 충고는 올바른 base64 문자열을 디코딩하고 있는지 확인하는 것입니다.
-
==============================
12.너는 다음을 사용해야한다.
너는 다음을 사용해야한다.
base64.b64decode(b64_string, ' /')
기본적으로 altchars는 '+ /'입니다.
from https://stackoverflow.com/questions/2941995/python-ignore-incorrect-padding-error-when-base64-decoding by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 예외 (테스트 만)가 아닌 것처럼 numpy 경고를 어떻게 catch합니까? (0) | 2018.10.07 |
---|---|
[PYTHON] 셀레늄 요소 보이지 않는 예외 (0) | 2018.10.07 |
[PYTHON] Flask 요청의 다른 부분을 어떻게 얻습니까? (0) | 2018.10.07 |
[PYTHON] matplotlib의 날짜 틱 및 회전 (0) | 2018.10.07 |
[PYTHON] 파이썬 2로 파이썬 3 오픈 (인코딩 = "utf-8") 백 포트 (0) | 2018.10.07 |