216.73.216.36 TODAY : 4,367
자료실 서브 타이틀 아이콘

기술문서

 > 

MS SQL Server

MSSQL에서 이미지 파일을 해시값(Hash)으로 저장 *데이터 중복 방지(Deduplication)* 위변조 확인

자료 기본정보

MSSQL에서 이미지 파일을 해시값(Hash)으로 저장 *데이터 중복 방지(Deduplication)* 위변조 확인

주요 프로그램 스펙

  • 평점: 10.0
  • 라이선스: free

피드백 및 다운로드

  • 사용자 평점: 10.0
  • 조회: 4

제조사 및 등록 정보

  • 제작사: LUZENSOFT
  • 등록일: 2025-12-22 09:34:43
  •  

- 설명

MSSQL에서 이미지 파일을 해시값(Hash)으로 저장하는 것은 **데이터 중복 방지(Deduplication)**나 이미지 위변조 확인을 위해 아주 좋은 방법입니다.

이미지 자체를 저장하는 방식과 해시값을 추출하여 저장하는 과정을 단계별로 설명해 드립니다.


uploadImage


1. 테이블 구조 설계

이미지 데이터(Binary)와 그 이미지의 해시값을 저장할 테이블을 만듭니다. 해시값은 앞서 설명해 드린 대로 SHA-256을 사용할 경우 32바이트(Binary) 또는 **64글자(String)**로 저장합니다.

SQL

CREATE TABLE ImageStorage (
    ImageID INT IDENTITY(1,1) PRIMARY KEY,
    ImageName NVARCHAR(255),
    ImageData VARBINARY(MAX),             -- 실제 이미지 데이터
    ImageHash BINARY(32) UNIQUE,           -- SHA-256 해시값 (중복 방지를 위해 UNIQUE 설정)
    CreatedAt DATETIME DEFAULT GETDATE()
);


2. MSSQL 내장 함수로 해시값 생성하기

MSSQL의 HASHBYTES 함수를 사용하면 저장 시점에 바로 해시를 생성할 수 있습니다.

데이터 삽입 예시:

SQL

-- 외부 파일을 직접 읽어와서 해시와 함께 저장하는 예시
INSERT INTO ImageStorage (ImageName, ImageData, ImageHash)
SELECT 
    'my_photo.jpg',
    BulkColumn,
    HASHBYTES('SHA2_256', BulkColumn) -- 이미지 바이너리에서 바로 SHA-256 추출
FROM OPENROWSET(BULK 'C:Imagesmy_photo.jpg', SINGLE_BLOB) AS img;


3. 실무 운영 팁

① 중복 이미지 체크 (가장 큰 장점)

새 이미지를 저장하기 전에 이미 같은 해시값이 있는지 확인하여 저장 공간을 절약할 수 있습니다.

SQL

IF EXISTS (SELECT 1 FROM ImageStorage WHERE ImageHash = HASHBYTES('SHA2_256', @NewImageData))
BEGIN
    PRINT '이미 존재하는 이미지입니다.';
END

② 인덱스 성능

VARBINARY(MAX) 컬럼은 검색 속도가 매우 느리지만, 고정 길이인 BINARY(32) 타입의 ImageHash 컬럼에 인덱스를 걸면 수백만 건의 이미지 중에서도 동일한 이미지를 순식간에 찾아낼 수 있습니다.

③ 해시 알고리즘 선택

  • SHA2_256: 현재 가장 권장되는 방식입니다. (결과값 32바이트)

  • MD5: 속도는 빠르나 보안성이 낮고 충돌 위험이 있어, 아주 가벼운 중복 체크 용도로만 사용합니다. (결과값 16바이트)


4. 주의사항: HASHBYTES의 제한

MSSQL의 HASHBYTES 함수는 버전마다 입력 값의 크기 제한이 다를 수 있습니다.

  • SQL Server 2014 이전: 입력 데이터가 8,000바이트를 넘으면 해시를 생성할 수 없습니다.

  • SQL Server 2016 이후: 이 제한이 사라져 VARBINARY(MAX) 같은 큰 데이터도 처리가 가능합니다.

만약 구버전 SQL Server를 사용 중이시거나, 서버 부하를 줄이고 싶다면? 이미지를 서버로 업로드하는 **애플리케이션 단(C#, Python, Node.js 등)**에서 미리 해시값을 계산해서 SQL로 전달하는 방식이 더 효율적일 수 있습니다.