Я шифрую поле, password
для которого называется моя таблица , в usuario
которой есть эти поля:
idlogin
username
llave
Nombres
dni
Для шифрования я использую эту процедуру при вставке записи:
create PROCEDURE RegistrarUsuario
@username nvarchar(50),
@llave nvarchar(50),
@nombres nvarchar(500),
@dni nvarchar(8)
AS
BEGIN
INSERT INTO dbo.usuario
(username,llave,Nombres,dni)
VALUES (@username
, ENCRYPTBYPASSPHRASE('password', @llave)
,@nombres
,@dni
)
end
GO
Но при регистрации в ключевом поле, которое зашифровано, выходит пустое:
Изначально поле
Llave
должно быть объявлено типаVARBINARY
, это для того, чтобы там сохранилось зашифрованное значение. Для этого определение таблицы должно быть следующим (или хотя бы чем-то подобным):Далее сохранение для поля
Llave
должно быть с:Итак, INSERT выглядит следующим образом:
Теперь, чтобы восстановить зашифрованный пароль, он будет с:
Чтоб ты
SELECT
был следующим:Здесь вы можете увидетьdemostración
Наконец, ваша хранимая процедура должна выглядеть следующим образом, обратите внимание, что тип данных параметра
@llave
— это a ,VARCHAR
а не aNVARCHAR
:Здесь вы можете увидеть второйdemostración
Примечание. Я не уверен, существуют ли термины « зашифровано » и « расшифровано », но надеюсь, что это поможет вам лучше понять ответ.
Одним из самых распространенных решений является использование
salt
доп. для каждой записи.Пример на PHP, но концепция применима:
При создании записи сгенерируйте соль и хэш, объединив пароль с солью.
Хранить в базе данных
$salt
и$saltedPassword
.При проверке правильности ключа вы используете ту же конкатенацию с солью, но на этот раз с ключом, чтобы проверить и сравнить его с
$saltedPassword
:Таким образом, вы менее уязвимы для массового взлома паролей с помощью атаки по хэш-словарю.