#php #mysql #sql-server #password-hash
#php #mysql #sql-сервер #пароль-хэш
Вопрос:
Пароль должен соответствовать хэшу пароля, который изначально был создан на платформе .NET и сохранен в MSSQL (поэтому шифрование, вероятно, SHA1).
Вот как выглядит таблица MySQL:
CREATE TABLE IF NOT EXISTS `test` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`UserName` varchar(100) COLLATE latin1_general_ci DEFAULT NULL,
`PasswordHash` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
`PasswordSalt` int(10) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=12535 ;
--
-- Dumping data for table `test`
--
INSERT INTO `test` (`id`, `UserName`, `PasswordHash`, `PasswordSalt`) VALUES(9836, 'demoadmin', '?z1??9t|????eamp;??9aK', -1190254076);
INSERT INTO `test` (`id`, `UserName`, `PasswordHash`, `PasswordSalt`) VALUES(12534, 'sunny', '??o\(R?8~??6>?t????o', 549612932);
Я нашел два очень близких примера того, что мне нужно сделать, но я смог заставить это работать.
Пример 1:http://gilbert.pellegrom.me/replicating-net-password-hashing-in-php /
Пример 2:http://www.kevinbruce.com/Blog?area_id=6amp;blog_id=3amp;ba_id=27
Имена пользователей и пароли являются:
Первый пользователь: demoadmin / demotest Второй пользователь: sunny / eclyptix
Пожалуйста, помогите!
Ответ №1:
Похоже, у вас проблема с кодировкой:
'?z1??9t|????eamp;??9aK'
Похоже, что ваш исходный код был поврежден и преобразовывал символы из диапазона ASCII для печати в вопросительные знаки.
Вы могли попытаться повторить это поведение в PHP. Однако продолжение использования этой неработающей схемы поставит под угрозу безопасность вашей системы, поскольку гораздо более вероятно, что может быть обнаружено столкновение хэшей. Возможно, потребуется заставить всех ваших пользователей изменить свои пароли. На этот раз убедитесь, что хэши сохранены правильно. Вы также можете рассмотреть возможность сохранения их в виде шестнадцатеричных строк вместо двоичных данных, чтобы свести к минимуму риск дальнейших проблем с кодированием.
Комментарии:
1. Спасибо за ваш ответ, я согласен с вами. Однако мне нужно сделать так, чтобы это работало, насколько это возможно, поскольку у нас есть устаревшая база данных с большим количеством пользователей. Вот как они изначально хранятся в базе данных SQL Server 2008 (я бы сказал, что они хранятся в двоичном формате), и нам нужно скопировать их в базу данных MySQL и заставить ее работать с PHP. С этого момента мы можем кодировать их в шестнадцатеричные строки и улучшать ситуацию.
2. @crazyhorse: Если вам повезет, данные были правильно сохранены на SQL Server, и вы просто неправильно экспортировали / импортировали.
3. к сожалению, это точно такая же ситуация и на производственном сервере SQL Server.
Ответ №2:
Здесь Кевин Брюс (из второго примера, который вы привели).
Как бы то ни было, я так и не смог решить проблему с моим опытом. На самом деле я говорил с Элизабет Смит (которая работает над PHP core для Windows), и она согласилась, что существует большая разница в поддержке хэша на том же уровне, что и .NET, из-за поддержки кодировки символов в PHP. Это то, что я подозревал.