Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Хранение паролей в MS SQL Server 2008  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
Вот таким образом сохраняю информацию о пользователе

	INSERT INTO Users(Id, EMail, Nick, FirstName, LastName, [Password], Roles, Deleted)
		VALUES(@Id, @EMail, @Nick, @FirstName, @LastName, HASHBYTES ('SHA1', @Password), @Roles, 0)


Вот таким образом проверю правильность пары логин-пароль:

	DECLARE @hashedPassword varbinary(100)
	SET @hashedPassword = HASHBYTES('SHA1', @Password)
	PRINT @hashedPassword -- это только для проверки
	DECLARE @storedPassword varbinary(100)
	SELECT @storedPassword = [Password] FROM Users WHERE EMail = @EMail
	PRINT @storedPassword -- это тоже только для проверки
	IF @storedPassword = @hashedPassword SET @Result = 1
	ELSE SET @Result = 0

Почему не совпадают hash-коды паролей, хотя ввожу их правильно, и соответственно, не проходит авторизация пользователя? Может, как-то по-другому хранить пароли?
26 мар 13, 15:47    [14097533]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
EMail поди не уникальный.
26 мар 13, 15:57    [14097625]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Ну и тип поля [Password] не угадать никак.

Сообщение было отредактировано: 26 мар 13, 15:58
26 мар 13, 15:58    [14097637]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
EMail уникальный - всего одна запись в таблице.
Password varbinary(8000)
26 мар 13, 16:09    [14097711]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Интересно, а зачем городить свои городушки, а не использовать имеющиеся механизмы авторизации пользователей SQL Server?!
26 мар 13, 16:10    [14097718]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
pkarklin,

Дык, там трёхзвенка, скорее всего
26 мар 13, 16:12    [14097731]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
Это не для пользователей SQL Server'а.
26 мар 13, 16:12    [14097734]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Гость333
Дык, там трёхзвенка, скорее всего


Это не мешает использовать авторизацию SQL Server.
26 мар 13, 16:14    [14097738]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
maxapet
Это не для пользователей SQL Server'а.


Ну так сделайте их пользователями SQL Server. Зачем пытаться что-то изобрести, причем неработающее, вместо того, чтобы использовать имеющееся готовое.
26 мар 13, 16:15    [14097746]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Тогда показывайте, как вы объявляете и инициализируете переменную @Password.

Ибо с хранением все хорошо:
set nocount on
go
declare @t table (
    [Password] varbinary(8000)
)
declare 
    @pwd    nvarchar (50)       = N'Пороль'
    
insert @t (
    [Password]
)
select
    hashbytes('sha1', @pwd)
    
if not exists ( select * from @t x where x.Password = hashbytes('sha1', @pwd) )
    print 'Все плохо'
else
    print 'Все хорошо'
26 мар 13, 16:16    [14097750]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
Гавриленко Сергей Алексеевич
Ну и тип поля [Password] не угадать никак.

в догонку, а параметры определены одинаково?


declare @s1 varchar(10) = 'qwerty'
declare @s2 char(10) = 'qwerty'
select HASHBYTES ('SHA1', @s1), HASHBYTES ('SHA1', @s2)

Result
0xB1B3773A05C0ED0176787A4F1574FF0075F7521E	
0x97BD15ECBE0B43B9F134A59C4D549BEA322E1F85
26 мар 13, 16:16    [14097754]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
Хотелось бы понять: почему не работает?
26 мар 13, 16:19    [14097764]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
pkarklin
maxapet
Это не для пользователей SQL Server'а.


Ну так сделайте их пользователями SQL Server. Зачем пытаться что-то изобрести, причем неработающее, вместо того, чтобы использовать имеющееся готовое.
Я даже могу придумать кейс, когда sql-аутентификация не подойдет. Например, пользователь с ником alex123 в двух разных базах - это два разных человека, с разными паролями.
26 мар 13, 16:20    [14097772]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
maxapet
Хотелось бы понять: почему не работает?
Потому что у вас ошибка.
26 мар 13, 16:20    [14097775]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
maxapet
Хотелось бы понять: почему не работает?


Гавриленко Сергей Алексеевич
Тогда показывайте, как вы объявляете и инициализируете переменную @Password.
26 мар 13, 16:21    [14097779]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Гавриленко Сергей Алексеевич
Я даже могу придумать кейс, когда sql-аутентификация не подойдет. Например, пользователь с ником alex123 в двух разных базах - это два разных человека, с разными паролями.


Если только изначально выставлять такие требования, что "пароль в базе".
26 мар 13, 16:23    [14097790]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
maxapet
Member

Откуда: Бердск, НСО
Сообщений: 499
"в догонку, а параметры определены одинаково?" - спасибо! Именно в этом было дело! В одном случае был nvarchar а в другом - varchar
26 мар 13, 16:24    [14097794]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
pkarklin
Если только изначально выставлять такие требования, что "пароль в базе".
Да нет. Это может быть просто база, которая планируется к размещению на хостинге. Как я понимаю, там не всем поднимают инстанс отдельный.
26 мар 13, 16:27    [14097811]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Гавриленко Сергей Алексеевич
Это может быть просто база, которая планируется к размещению на хостинге. Как я понимаю, там не всем поднимают инстанс отдельный.


Да, с хостингом м.б. проблемы в использовании аутенфикации SQL Server.
26 мар 13, 16:30    [14097830]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
maxapet,

я работаю с паролями вот так
заливка
update
PASSWORD=convert(varbinary(256), pwdencrypt(@Password))
проверка
where pwdcompare(?PASSWORD,R.PASSWORD)=1

тут конечно скажут некомпатибилити и пр.
но с 2000 по 2008 работает без проблем
26 мар 13, 17:47    [14098362]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
leov
maxapet,

я работаю с паролями вот так
заливка
update
PASSWORD=convert(varbinary(256), pwdencrypt(@Password))
проверка
where pwdcompare(?PASSWORD,R.PASSWORD)=1

тут конечно скажут некомпатибилити и пр.
но с 2000 по 2008 работает без проблем


во-первых
PWDENCRYPT — это устаревшая функция, которая может не поддерживаться в будущих версиях SQL Server. Вместо этого используйте программу HASHBYTES.

и во-вторых
declare @s1 varchar(10) = 'qwerty'
declare @s2 char(10) = 'qwerty'

select PWDCOMPARE (@s2, PWDENCRYPT(@s1))

result 0

т.е чем не пользоваться, но типы должны быть идентичны.
У автора как раз тут и были проблемы
26 мар 13, 17:56    [14098408]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
HandKot,

с типами то оно само собой разумеется надо соответствовать

сделано так изначально дак стоит пока стоит
придет пора на следующий сервер переезжать
оттестируем, не пройдет дак переделаем
спасибо за подсказку, не придется лишний раз искать

вот только вопрос один есть
с этим HASHBYTES вроде результат просто сравнением сравнивают
т.е один пароль в закодированном виде всегда одинаково выглядит
а вот с PWDENCRIPT оно всегда по разному выглядит
а сравнивается специальной функцией

может кто-нибудь про это что-то сказать?
26 мар 13, 18:15    [14098485]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
leov
с этим HASHBYTES вроде результат просто сравнением сравнивают
т.е один пароль в закодированном виде всегда одинаково выглядит
а вот с PWDENCRIPT оно всегда по разному выглядит

В функции pwdencrypt пароль солится перед хешированием
26 мар 13, 18:37    [14098566]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Гость333
leov
с этим HASHBYTES вроде результат просто сравнением сравнивают
т.е один пароль в закодированном виде всегда одинаково выглядит
а вот с PWDENCRIPT оно всегда по разному выглядит

В функции pwdencrypt пароль солится перед хешированием
а по русски(английски) это можно сказать? а то я что-то не врубаюсь. типа как капусту солят? :-)
26 мар 13, 18:46    [14098600]     Ответить | Цитировать Сообщить модератору
 Re: Хранение паролей в MS SQL Server 2008  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2994
leov
Гость333
пропущено...

В функции pwdencrypt пароль солится перед хешированием
а по русски(английски) это можно сказать? а то я что-то не врубаюсь. типа как капусту солят? :-)


гугль расскажет


Salt

Но влияет ли время на хеш непосредственно? Ответ - нет. Функция Time() создает лишь исходную точку для функции srand(), которая генерирует два случайных числа. Эти числа объединяются (с большой долей вероятности можно также предположить, что эти числа также приводятся к "сокращенному варианту") и получается salt, который в дальнейшем используется при "производстве" хеша.

Криптование пароля

Пароль преобразуется в Unicode и к нему добавляется salt. Потом все это проходит через функции криптования в advapi32.dll - в результате мы получает "третью" часть хеша (как мы рассматривали в пункте про влияние регистра). Потом пароль преобразуется в верхний регистр и указанные манипуляции повторяются - получаем "четвертую" часть хеша. Затем производится "сборка" окончательного вариант хеша, который и будет хранится в базе:
26 мар 13, 19:00    [14098674]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить