Создайте асимметричный ключ в SQL, используя переменный пароль (из хранимой процедуры)

create procedure SP_INS_PUBLIC_NHANVIEN  
    @manv varchar(20),
    @hoten nvarchar(100),
    @email varchar(20),
    @luongcb varbinary ,
    @tendn nvarchar(100),
    @mk varchar

as 
    create asymmetric key mahoaluongi
        with algorithm = RSA_512
        encryption by password = @mk
    insert into nhanvien values (@manv,@hoten,@email,ENCRYPTBYASYMKEY(mahoaluongi,@luongcb),@tendn,HASHBYTES('SHA1',@mk),@manv)
    drop asymmetric key mahoaluongi
go

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

Неверный синтаксис рядом с @mk. ожидается STRING или TEXT_LEX.

Но преобразовать varchar в STRING с помощью cast или convert было невозможно.

Я использую SQL Server 2014


person Quang Vĩnh Hà    schedule 06.05.2015    source источник
comment
Примечание: вы не должны не использовать префикс sp_ для своих хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования ( см. Именование хранимых процедур), и вы рискуете столкнуться с конфликтом имен в будущем. Это также плохо сказывается на производительности ваших хранимых процедур. Лучше просто избегать sp_ и использовать в качестве префикса что-то другое - или вообще не использовать префикс!   -  person marc_s    schedule 06.05.2015
comment
не рекомендуется создавать новый асимметричный ключ каждый раз, когда вы вставляете новую запись в nhanvien, а затем удаляете ее. Как вы потом будете расшифровывать данные?   -  person ughai    schedule 06.05.2015
comment
@ughai Я использую _mk в качестве пароля для входа и шифрования другого столбца. Поэтому мне нужно зашифровать его внутри хранимой процедуры   -  person Quang Vĩnh Hà    schedule 19.05.2015


Ответы (2)


Я предлагаю использовать Exec Command как следующий запрос:

create procedure SP_INS_PUBLIC_NHANVIEN  
    @manv varchar(20),
    @hoten nvarchar(100),
    @email varchar(20),
    @luongcb varbinary ,
    @tendn nvarchar(100),
    @mk varchar

as 
    DECLARE @C NVARCHAR(MAX) = 
    'create asymmetric key mahoaluongi
        with algorithm = RSA_512
        encryption by password = '''+@mk+''''
    EXEC(@C)
    insert into nhanvien values (@manv,@hoten,@email,ENCRYPTBYASYMKEY(ASYMKEY_ID('mahoaluongi'),@luongcb),@tendn,HASHBYTES('SHA1',@mk),@manv)
    Exec('drop asymmetric key mahoaluongi')
person mehdi lotfi    schedule 06.05.2015
comment
но у него все еще есть «недопустимое имя имени столбца mahoaluongi» в функции encryptbyasymkey - person Quang Vĩnh Hà; 19.05.2015
comment
@QuangVĩnhHà. Я изменил свой код. Проверьте еще раз, пожалуйста. - person mehdi lotfi; 20.05.2015

Попробуй это:

CREATE PROCEDURE SP_INS_PUBLIC_NHANVIEN 
    @MANV   VARCHAR(20) ,
    @HOTEN  NVARCHAR(100),
    @EMAIL  VARCHAR (20),
    @LUONGCB    VARCHAR(100),
    @TENDN  NVARCHAR(100),
    @MK     VARCHAR(100)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @SQL NVARCHAR(MAX);
    IF ASYMKEY_ID(@MANV) IS NULL
    BEGIN
        SET @SQL = 'CREATE ASYMMETRIC KEY '  + QUOTENAME(@MANV) + ' ' +
                 'WITH ALGORITHM = RSA_2048 ' + 
                 'ENCRYPTION BY PASSWORD = ' + QUOTENAME(@MK , NCHAR(39))
        EXEC (@SQL)
    END

    DECLARE @MATKHAU_SHA1 VARBINARY(MAX);
    SET @MATKHAU_SHA1 = CONVERT(VARBINARY(MAX),HASHBYTES('SHA1', @MK));

    DECLARE @LUONG_RSA512 VARBINARY(MAX);
    SET @LUONG_RSA512 = ENCRYPTBYASYMKEY(ASYMKEY_ID(@MANV), @LUONGCB);

    DECLARE @PUBKEY NVARCHAR(20);
    SELECT @PUBKEY = CONVERT(NVARCHAR(20),@MANV);

    INSERT INTO DBO.NHANVIEN
    VALUES (@MANV, @HOTEN, @EMAIL, ENCRYPTBYASYMKEY(ASYMKEY_ID(@MANV), @LUONGCB), @TENDN, @MATKHAU_SHA1,@PUBKEY);
END
GO
person Duc Huy    schedule 13.05.2021
comment
Пожалуйста, рассмотрите возможность добавления описания к коду, чтобы мы поняли, ПОЧЕМУ он решает проблему оператора. - person Simas Joneliunas; 14.05.2021