У меня есть база данных в SQL Server 2008, которая выполняет аутентификацию пользователя с помощью хранимой процедуры для существующего веб-приложения PHP. Веб-приложение отправляет хранимой процедуре строку, однако хранимая процедура сохраняет ее, и проверяет значение с помощью контрольной суммы SQL (http://msdn.microsoft.com/en-us/library/ms189788.aspx).. Хранимая процедура преобразует строку как NVARCHAR (50) и сохраняет CHECKSUM как int в таблица пользователей.
Сейчас я пишу новое Java-приложение поверх существующей базы данных и пишу собственный менеджер аутентификации Spring. Я хотел бы повторно реализовать алгоритм CHECKSUM в Java, поэтому мне не нужно вызывать хранимую процедуру для выполнения преобразования, однако я не могу найти никакой документации о том, как работает SQL CHECKSUM.
Я попробовал следующий код, предположив, что это CRC32, однако он не может вернуть то же значение, что и SQL CHECKSUM:
String pass = "foobar";
CRC32 crc32 = new CRC32();
crc32.update(pass.getBytes("UTF-16")); //This is due to the stored procedure casting as nvarchar
crc32.getValue();
Может кто-нибудь указать мне на алгоритм, который использует SQL CHECKSUM, чтобы я мог повторно реализовать его в Java?
Вопрос также не в том, какой алгоритм обеспечивает лучший хэш для безопасности. Безопасность в данном конкретном случае выходит за рамки требований, поскольку мы не готовы к принудительному сбросу пароля для всей системы. Вопрос в том, какой алгоритм используется T-SQL CHECKSUM, чтобы его можно было повторно реализовать. Этот конкретный вариант использования предназначен для аутентификации, однако существует вероятность того, что это необходимо во многих различных приложениях.