[SQL Server] MD2のデータ暗号化及びパスワード暗号化

inno
2014-04-05 11:29 2461 0
[SQL Server] MD2のデータ暗号化及びパスワード暗号化

MD2を使ってデータやパスワードを暗号化することができます。
基本的にはMD2よりMD5を使うことをおすすめします。

MD5のデータ暗号化&パスワード暗号化関連http://www.innoya.com/Board/ViewBlog.aspx?menuID=4&idx=320

SQL SERVER 2005以上で使えます。
MD2は128Bitで16Byteを使いますので、
このデータを保存する際にはデータ型をvarbinary(16)に指定してください。

DECLARE @Str varchar(100)
SET @Str = 'innoya'
SELECT HASHBYTES('MD2', @Str)

実行結果


ここで注意点!!!!
暗号化(ハッシュ)する文字のデータ型によって同じ文字列でも戻り値は変わります。
下記は同じ文字をvarcharとnvarcharに保存して暗号化(ハッシュ)するSQLです。

DECLARE @Str1 varchar(100), @Str2 nvarchar(100)
SET @Str1 = 'innoya'
SET @Str2 = 'innoya'
SELECT HASHBYTES('MD2', @Str1) AS Str_varchar, HASHBYTES('MD2', @Str2) AS Str_nvarchar

実行結果


これはMD2だけではなく、「HASHBYTES」関数を使用するMD2, MD4, MD5, SHA, SHA1, SHA2_256(SHA256), SHA2_512(SHA512)すべて同じですので注意してください。。


MD2に暗号化したデータを文字列に変更する方法
master.dbo.fn_varbintohexstr」を使うとバイナリを文字列に変更することができます。

DECLARE @Str varchar(100)
DECLARE @DataVarbinary varbinary(16)
SET @Str = 'innoya'
SET @DataVarbinary = HashBytes('MD2', @Str)

SELECT master.dbo.fn_varbintohexstr(@DataVarbinary) AS [Result], @DataVarbinary AS [VarbinaryData]


実行結果


master.dbo.fn_varbintohexstr(@DataVarbinary)で「0xc0391828a2c0928601ed8bb0d507b76c」が返されました。
頭文字に変更したのにバイナリデータ見たいに「0x」が付いています。
頭文字の「0x」が必要ない時は「RIGHT」を使って後ろから32文字を切り取ります。
暗号化する文字が長くても暗号化したらvarbinary(16)に決まっているので
文字列に変更すると頭文字の「0x」を除いたら32文字になります。

DECLARE @Str varchar(100)
DECLARE @DataVarbinary varbinary(16)
SET @Str = 'innoya'
SET @DataVarbinary = HashBytes('MD2', @Str)

SELECT RIGHT(master.dbo.fn_varbintohexstr(@DataVarbinary),32)

実行結果


上記の結果からまた文字列を大文字にしたい場合は「UPPER」を利用します。

DECLARE @Str varchar(100)
DECLARE @DataVarbinary varbinary(16)
SET @Str = 'innoya'
SET @DataVarbinary = HashBytes('MD2', @Str)

SELECT UPPER(RIGHT(master.dbo.fn_varbintohexstr(@DataVarbinary),32))

実行結果

コメント