Python으로 Google Cloud Storage의md5 체크섬 계산하기

4678 단어 GCPPythontech

결론

  • gsutil을 통해 얻은md5 검사와 RFC1864에 적힌 콘텐츠-MD5 헤더와 같은 규칙에 따라 계산된
  • 따라서 문장 제목은'파이톤으로 계산하기Content-MD5'와 동일한 의미
  • 배경.


    과제: GCS에 업로드된 파일 사이에 중복된 파일이 잘못 전송되었는지 조사
    구속: gsutil 명령을 사용할 수 없습니다 (사용할 수 있다면 gsutil hash로 순간적으로 죽일 수 있습니다)

    md5 검사와 검증 파일의 일치성


    흔히 볼 수 있는 방법으로md5 검사를 받고 비교하는 방법이 있기 때문에 먼저 시도해 보겠습니다.
    GCS를 표준 규격대상 단위로md5 검사와으로 하기 때문에 이것을 사용하면 간단해 보입니다.
    이번에는 gsutil을 규정에 따라 사용할 수 없기 때문에python을 사용합니다.
    from google.cloud import storage
    client = storage.Client()
    bucket = client.get_bucket("my-test-bucket000")
    blob = bucket.blob("test.txt")
    
    blob.reload()
    blob.md5_hash
    
    결과는'2Oj8otwPiW/Xy0ywAxuiSQ=='이었다.나는 많은 사람들이 이 문자열에 대해 매우 화가 났다고 생각한다.
    다음에python으로 같은 파일의md5 검사와
    import hashlib
    with open("test.txt", "rb") as f:
        print(hashlib.md5(f.read()).hexdigest())
    
    결과는'd8e8fca2dc0f896fd7cb4cb003ba249'로 완전히 일치하지 않습니다.
    (읽기 어려워서hexdigest를 사용하지만 다음은digest를 사용한다)

    base64 + md5


    방금 GCS 측에서'2Oj8otwPiW/Xy0ywAxuiSQ=='을 확인했지만, HTTP의 흐름이 Base64 인코딩된 문자열과 비슷하다고 생각해서 콘텐츠-MD5 머리에 뭐가 있는지 조사해 봤다.
    처음에도 RFC1864라고 썼는데 기록된 바와 같이 128bit의 MD5 요약을 얻은 후에 베이스 64 인코딩을 곱한 것 같다.
    그러니까 다시 계산해 봐.
    import hashlib
    import base64
    with open("test.txt", "rb") as f:
        print(print(base64.b64encode(hashlib.md5(f.read()).digest())))
    
    GRS의 결과 "2Oj8otwPiW/Xy0ywAxuiSQ==="와 일치

    좋은 웹페이지 즐겨찾기