Patilvikasv Ответов: 1

Когда я вставляю пароль с помощью шифрования получаю ошибку


CREATE TABLE [dbo].[tbl_user](
	[id] [int] IDENTITY(1,100) NOT NULL,
	[full_name] [varchar](100) NOT NULL,
	[email] [varchar](255) NOT NULL,
	[phone] [varchar](100) NOT NULL,
	[password] [varbinary](max) NOT NULL,
	[photo] [varchar](255) NOT NULL,
	[role] [varchar](30) NOT NULL,
	[status] [varchar](10) NOT NULL,
) 

это структура таблицы
и использование процедуры хранения зашифрованного пароля


CREATE PROC [dbo].[usp_tbl_userInsert] 
	@pFlag varchar(10),
    @id int,
    @full_name varchar(100),
    @email varchar(255),
    @phone varchar(100),
    @password varbinary(max),
    @photo varchar(255),
    @role varchar(30),
    @status varchar(10)
AS
	BEGIN 
	BEGIN TRY
     BEGIN TRANSACTION
 
   if @pFlag='I'
   BEGIN
	INSERT INTO dbo.tbl_user (id, full_name, email, phone, password, photo, role, status)
	SELECT @id, @full_name, @email, @phone,CONVERT(varbinary(MAX),encryptbypassphrase('IAMGROOT',@password)), @photo, @role, @status
	IF @@TRANCOUNT > 0
         COMMIT
   END
   IF @pFlag='E'
	BEGIN 
	BEGIN TRANSACTION
	UPDATE dbo.tbl_user
	SET    full_name = @full_name, email = @email, phone = @phone, password =CONVERT(varbinary(MAX),encryptbypassphrase('IAMGROOT',@password)), photo = @photo, role = @role, status = @status
	WHERE  id = @id
	   IF @@TRANCOUNT > 0
         COMMIT
	END
	 IF @pFlag='D'	
		
	BEGIN 

	DELETE
	FROM   dbo.tbl_user
	WHERE  id = @id
    END
 
   END TRY

   BEGIN CATCH 

      IF @@TRANCOUNT > 0
         ROLLBACK
 
      SELECT ERROR_NUMBER() AS ErrorNumber
      SELECT ERROR_MESSAGE() AS ErrorMessage
 
   END CATCH
END



--Exec [usp_tbl_userInsert] 'I',0,'ewrwer','wrwer@gmail.com','0987654321',Vikas,'','sysadmin',''


Что я уже пробовал:

получаю ошибку
Цитата:
Msg 257, Уровень 16, состояние 3, процедура usp_tbl_userInsert, строка 0
Неявное преобразование из типа данных varchar в varbinary(max) не допускается. Используйте функцию CONVERT для выполнения этого запроса.

1 Ответов

Рейтинг:
1

OriginalGriff

Вы передаете строку в качестве пароля вместо VARBINARY, и SQL не позволит вам сделать это - вам нужно преобразовать его в массив байтовых значений, прежде чем передавать его в SQL.

Но ... не шифруйте свои пароли: Хранение паролей: как это сделать.[^]

Делать это подобным образом-значит просто напрашиваться на проблемы и, вероятно, достаточно небрежно, чтобы заслужить большой штраф за нарушение GDPR ... любой, кто имеет доступ к вашей БД и ее содержимому, имеет доступ к паролю, так что вы вполне можете хранить их в обычном тексте!