Google Cloud

[Cloud Storage] MD5 hash 값을 활용하여 파일 무결성 체크

창MIN 2024. 3. 25. 14:20

 

파일 무결성 검사란, 파일이 변경 되었는지 확인하는 작업이라 간단하게 이야기 할 수 있다.

 

이 글의 목표.

GCS에 있는 파일을 md5 값을 확인하여 .md5파일을 생성하자.

 

프로세스.

GCS에 있는 파일을 전송할때 .md5 파일을 함께 전송하여 파일을 받는 측에서 csum -h MD5 명령어로 파일의 적합성을 확인합니다.


1. 현재 파일의 MD5 값 확인하기

- 첫번째: gsutil 값으로 확인 가능 

https://cloud.google.com/storage/docs/gsutil/commands/hash

gsutil hash [-c] [-h] [-m] filename...

 

 

- 두번째: 객체의 메타 데이터를 직접 가져오기

https://cloud.google.com/storage/docs/samples/storage-get-metadata?hl=ko#storage_get_metadata-python

 

   blob = bucket.get_blob(blob_name)

    print(f"Blob: {blob.name}")
    print(f"Bucket: {blob.bucket.name}")
    print(f"Storage class: {blob.storage_class}")
    print(f"ID: {blob.id}")
    print(f"Size: {blob.size} bytes")
    print(f"Updated: {blob.updated}")
    print(f"Generation: {blob.generation}")
    print(f"Metageneration: {blob.metageneration}")
    print(f"Etag: {blob.etag}")
    print(f"Owner: {blob.owner}")
    print(f"Component count: {blob.component_count}")
    print(f"Crc32c: {blob.crc32c}")
    print(f"md5_hash: {blob.md5_hash}")

 

 

2. Cloud Storage bucket 연결 후 .md5 파일 생성

 

- Google Storage 연결 부분

import base64
import os
from google.cloud import storage
from google.cloud.storage.blob import Blob

os.environ["GOOGLE_APPLICATION_CREDENTIALS"]="../key.json"


storage_client = storage.Client()
# buckets = list(storage_client.list_buckets())
bucket = storage_client.bucket("본인의 버킷 Name")

 

 

- 객체의 md5 값 추출 후 GCS 파일 생성

def save_all_md5():
    try:
        blobs = bucket.list_blobs()
        
        for blob in blobs:
            assert isinstance(blob, Blob) # 타입 체크
            
            if not blob.name.endswith('.md5'):
                
                blob.reload() 
                # print(f"md5_hash: {blob.md5_hash}")

                #base64디코딩 and 16진수
                md5_hash = base64.b64decode(blob.md5_hash).hex() 
                print(md5_hash)
                
                # Create
                md5_filename = f"{blob.name}.md5"
                md5_blob = bucket.blob(md5_filename)
                md5_blob.upload_from_string(md5_hash)
                
                print(f"Saved MD5 hash to {md5_filename}")
                
            else:
                
                print(f".md5 file 이미 존재 {blob.name}, skip...")
    
    except Exception as e:
        print(f"error occurred : {e}")
        

save_all_md5()

 

***blob.reload()

객체를 bucket.list_blobs() 시점에 blob를 가져 오지만 잠깐 사이에 변동 사항이 발생할수 있으니 한번 더 reload 한다는 의미입니다.

 

***md5_hash = base64.b64decode(blob.md5_hash).hex() 

객체의 hash 값을 가져 왔을때 base64인코딩으로 추출 됩니다.

일반적으로 csum -h md5로 값을 확인 하고 해당 값은 base64 디코딩의 16진수 값이다.

 


결론

Google Cloud Storage에서 파일의 무결성을 검사하는 것은 데이터 보안을 유지하는 중요한 절차이고, MD5 해시 값을 활용한 방법은 이러한 검사를 수행하는 효과적인 방법 중 하나입니다.