Использование MD5 в SQL Server 2005 для создания файла контрольной суммы в varbinary - PullRequest
3 голосов
/ 03 января 2012

Я пытаюсь выполнить проверку MD5 для файла, загруженного в поле varbinary в MSSQL 2005.

Я загрузил файл и использовал

SELECT DATALENGTH(thefile) FROM table

Я получаю то же количество байтов, что и файл.

Но используя калькулятор MD5 (из bullzip), я получаю этот MD5:

20cb960d7b191d0c8bc390d135f63624

и используя SQL я получаю это MD5:

44c29edb103a2872f519ad0c9a0fdaaa

Почему они отличаются, если поле имеет одинаковую длину, и поэтому я предполагаю, что одни и те же байты?

Мой код SQL для этого был:

DECLARE @HashThis varbinary;
DECLARE @md5text varchar(250);
SELECT  @HashThis = thefile FROM CFile WHERE id=1;

SET @md5text = SUBSTRING(sys.fn_sqlvarbasetostr(HASHBYTES('MD5',@HashThis)),3,32)
PRINT @md5text;

Может быть преобразование типов данных?

Любой совет будет полезен.

Большое спасибо:)

Ответы [ 2 ]

3 голосов
/ 03 января 2012

Два варианта

  1. Тип VARBINARY без модификатора размера использует VARBINARY (1), поэтому вы хэшируете самый 1-й байт файла, SELECT DATALENGTH(@HashThis) после назначения, получите 1
  2. Если вы используете вместо этого varbinary (MAX) - имейте в виду, что HASHBYTES хэширует только первые 8000 байтов ввода

Если вы хотите выполнить хеширование более 8000 байт - напишите свою собственную хеш-функцию CLR, например, файл из моего проекта sql-сервера, он приносит те же результаты, что и другие хеш-функции вне sql-сервера:

using System;
using System.Data.SqlTypes;
using System.IO;

namespace ClrHelpers
{
    public partial class UserDefinedFunctions {
        [Microsoft.SqlServer.Server.SqlFunction]
        public static Guid HashMD5(SqlBytes data) {
            System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            md5.Initialize();
            int len = 0;
            byte[] b = new byte[8192];
            Stream s = data.Stream;
            do {
                len = s.Read(b, 0, 8192);
                md5.TransformBlock(b, 0, len, b, 0);
            } while(len > 0);
            md5.TransformFinalBlock(b, 0, 0);
            Guid g = new Guid(md5.Hash);
            return g;
        }
    };
}
1 голос
/ 03 января 2012

Может случиться так, что калькулятор MD5 создает хеш MD5 для содержимого файла + другие свойства (например, автор, дата последнего процесса и т. Д.). Вы можете попытаться изменить эти свойства и сделать еще один хеш, чтобы увидеть, равен ли результат (до и после использования только калькулятора MD5).

Другая возможность - это то, что вы действительно сохраняете в SQL Server.


Итак, совершенно ясно, что MD5 Calculator и SQL Server хэшируют разные вещи. Какие? Я поздравляю с ответом:)

...