복붙노트

[PYTHON] Python : Base64 디코딩시 '잘못된 패딩'오류 무시

PYTHON

Python : Base64 디코딩시 '잘못된 패딩'오류 무시

나는 거기에 패딩 오류가있는 경우에도 다시 바이너리로 변환하려는 base64로 인코딩 된 일부 데이터가 있습니다. 내가 사용하면

base64.decodestring(b64_string)

'잘못된 패딩'오류가 발생합니다. 다른 방법이 있습니까?

업데이트 : 모든 의견에 감사드립니다. 솔직히 말하면, 언급 된 모든 방법들은 약간의 타격을주었습니다. 그리워서 openssl을 사용해보기로 결심했습니다. 다음 명령은 대우를 수행했습니다.

openssl enc -d -base64 -in b64string -out binary_data

해결법

  1. ==============================

    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. ==============================

    2.필요한 경우 패딩을 추가하기 만하면됩니다. 그러나 마이클의 경고에 유의하십시오.

    필요한 경우 패딩을 추가하기 만하면됩니다. 그러나 마이클의 경고에 유의하십시오.

    b64_string += "=" * ((4 - len(b64_string) % 4) % 4) #ugh
    
  3. ==============================

    3.패딩 오류가 발생하면 문자열이 손상되었다는 의미 일 수 있습니다. base64로 인코딩 된 문자열은 길이가 4의 배수 여야합니다. 패딩 문자 (=)를 직접 추가하여 문자열을 4의 배수로 만들 수는 있지만, 뭔가 잘못되어 있지 않는 한 이미 있어야합니다.

    패딩 오류가 발생하면 문자열이 손상되었다는 의미 일 수 있습니다. base64로 인코딩 된 문자열은 길이가 4의 배수 여야합니다. 패딩 문자 (=)를 직접 추가하여 문자열을 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. ==============================

    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. ==============================

    6.디코딩하려는 데이터 소스의 문서를 확인하십시오. base64.b64decode (s) 대신 base64.urlsafe_b64decode (s)를 사용하는 것이 가능합니까? 그것이이 오류 메시지를 본 이유 중 하나입니다.

    디코딩하려는 데이터 소스의 문서를 확인하십시오. base64.b64decode (s) 대신 base64.urlsafe_b64decode (s)를 사용하는 것이 가능합니까? 그것이이 오류 메시지를 본 이유 중 하나입니다.

    예를 들어 Google Identity Toolkit 및 Gmail 페이로드와 같은 다양한 Google API의 경우입니다.

  7. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    10.이 오류가 웹 서버에서 발생한 경우 : 게시 된 값을 인코딩하는 URL을 사용해보십시오. "curl"을 통해 게시 중이었고 "base64 값을 url로 인코딩하지 않아"+ "같은 문자가 이스케이프되지 않았으므로 웹 서버 url-decode 논리가 자동으로 url-decode를 실행하고 공백으로 변환했습니다.

    이 오류가 웹 서버에서 발생한 경우 : 게시 된 값을 인코딩하는 URL을 사용해보십시오. "curl"을 통해 게시 중이었고 "base64 값을 url로 인코딩하지 않아"+ "같은 문자가 이스케이프되지 않았으므로 웹 서버 url-decode 논리가 자동으로 url-decode를 실행하고 공백으로 변환했습니다.

    "+"는 유효한 base64 문자이며 예기치 않은 url-decode에 의해 mangled되는 유일한 문자입니다.

  11. ==============================

    11.내 경우에는 전자 메일을 구문 분석하는 동안 그 오류가 발생했습니다. 첨부 파일을 base64 문자열로 가져 와서 re.search를 통해 압축을 풉니 다. 결국 엔 이상한 추가 부분 문자열이 끝에 있습니다.

    내 경우에는 전자 메일을 구문 분석하는 동안 그 오류가 발생했습니다. 첨부 파일을 base64 문자열로 가져 와서 re.search를 통해 압축을 풉니 다. 결국 엔 이상한 추가 부분 문자열이 끝에 있습니다.

    dHJhaWxlcgo8PCAvU2l6ZSAxNSAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWyhcMDAyXDMz
    MHtPcFwyNTZbezU/VzheXDM0MXFcMzExKShcMDAyXDMzMHtPcFwyNTZbezU/VzheXDM0MXFcMzEx
    KV0KPj4Kc3RhcnR4cmVmCjY3MDEKJSVFT0YK
    
    --_=ic0008m4wtZ4TqBFd+sXC8--
    

    - _ = ic0008m4wtZ4TqBFd + sXC8 -을 삭제하고 문자열을 제거한 후 구문 분석이 수정되었습니다.

    그래서 내 충고는 올바른 base64 문자열을 디코딩하고 있는지 확인하는 것입니다.

  12. ==============================

    12.너는 다음을 사용해야한다.

    너는 다음을 사용해야한다.

    base64.b64decode(b64_string, ' /')
    

    기본적으로 altchars는 '+ ​​/'입니다.

  13. from https://stackoverflow.com/questions/2941995/python-ignore-incorrect-padding-error-when-base64-decoding by cc-by-sa and MIT license