8000 Byte’tan Büyük Binary Verilerin Hash’lenmesi

Published on 02 January 2014 by in Encryption / Okunma: 2,451

0

Eğer VARCHAR, NVARCHAR veya VARBINARY veri tipindeki verileri hash’lemek istersek HASHBYTES built-in fonksiyonunu kullanırız. SQL Server 2012 ile birlikte HASHBYTES ile MD2, MD4, MD5, SHA, SHA1, SHA2_256 ve SHA2_512 algoritmaları ile veriyi hash’lememiz mümkündür. SQL Server 2008 R2′de SHA2_256 (256 Bit – 32 Byte) ve SHA2_512 (512 Bit – 64 Byte) algoritmaları yoktu. SQL Server 2012 ile birlikte bu algoritmalar HASHBYTES’a eklenmiş durumdadır. HASHBYTES’ın Kullanım şekli için aşağıdaki örnek kodu inceleyebilirsiniz.

SELECT HASHBYTES ('MD5',  'SQL Server Onculeri')

 

Burada dikkat edilmesi gereken nokta verinin 8000 byte’ı geçmemesidir. Verimizi tam 8000 Byte olacak şekilde uyarlayıp çalıştırıyoruz.

DECLARE @BinaryData AS VARBINARY(8000)
    SET @BinaryData = CONVERT(VARBINARY, REPLICATE('SQL Server', 8000))
SELECT HASHBYTES ('MD5',  @BinaryData)

 

 

 

Görüldüğü gibi 8000 Byte’lık bir VARBINARY verisini rahatlıkla MD5′a çevirdik. Peki sorgumuzdaki veriyi 8000 + 1 Byte olarak set edersek ne olacak onuda görelim.

DECLARE @BinaryData AS VARBINARY(MAX)
    SET @BinaryData = CONVERT(VARBINARY(MAX), REPLICATE('SQL Server', 8000))
	SET @BinaryData = @BinaryData + 0x01
SELECT HASHBYTES ('MD5',  @BinaryData)

 

Yukarıdaki sorguyu çalıştırdığımızda aşağıdaki gibi bir hata mesajı ile karşılaşıyoruz.

Msg 8152, Level 16, State 10, Line 4 String or binary data would be truncated.

Nedenine yukarıda değindik. HASHBYTES sadece 8000 Byte’a izin vermektedir. Peki 8000 Byte’tan fazla veriler için ne yapmamız gerekir. İlk akla gelen SQLCLR (SQL Common Language Runtime) olacaktır. SQLCLR ile yazacağımız bir .NET library’sini SQL Server’a external dll olarak tanımlayıp 8000 Byte’tan fazla verileri rahatlıkla Hash’lemeniz mümkündür. Fakat CLR, çoğu kurumun güvenlik politikasına aykırıdır ve kullanılmak istenmez.

SQLCLR haricinde alternatif bir yöntem vardır. Çok bilinmeyen ama gayet kullanışlı bir built-in fonksiyon bulunmaktadır. Master database’i altında bulunan fn_repl_hash_binary fonksiyonu yardımı ile 8000 Byte’tan büyük verilerimizi rahatlıkla Hashlememiz mümkün oluyor. Fakat unutmamak gerekirki bu fonksiyon sadece binary verimizi MD5 algoritması ile hashliyor. HASHBYTES’da ki gibi diğer algoritmaları kullanmak mümkün olmuyor.

Sorgumuzu fn_repl_hash_binary fonksiyonu ile tekrardan aşağıdaki gibi oluşturuyoruz ve sorgumuzun MD5 algoritması ile hash’lendiğini görüyoruz.

USE [master]
GO

DECLARE @BinaryData AS VARBINARY(MAX)
    SET @BinaryData = CONVERT(VARBINARY(MAX), REPLICATE('SQL Server', 8000))
	SET @BinaryData = @BinaryData + 0x01
SELECT [sys].[fn_repl_hash_binary](@BinaryData)

 

Leave a Reply