Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用可变密码(从存储过程)在SQL中创建非对称密钥_Sql_Sql Server_Stored Procedures_Encryption_Sql Server 2014 - Fatal编程技术网

使用可变密码(从存储过程)在SQL中创建非对称密钥

使用可变密码(从存储过程)在SQL中创建非对称密钥,sql,sql-server,stored-procedures,encryption,sql-server-2014,Sql,Sql Server,Stored Procedures,Encryption,Sql Server 2014,我想创建一个新的非对称密钥,每次使用新密码,从存储过程的参数传递。 我犯了一个错误 @mk附近的语法不正确。应为字符串或文本 但使用cast或convert无法将varchar转换为字符串 我正在使用SQL server 2014我建议使用Exec命令进行以下查询: create procedure SP_INS_PUBLIC_NHANVIEN @manv varchar(20), @hoten nvarchar(100), @email varchar(20),

我想创建一个新的非对称密钥,每次使用新密码,从存储过程的参数传递。 我犯了一个错误

@mk附近的语法不正确。应为字符串或文本

但使用
cast
convert
无法将varchar转换为字符串


我正在使用SQL server 2014

我建议使用Exec命令进行以下查询:

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
试试这个:

ALTER PROCEDURE SP_INS_ENCRYPTED_KEY @name VARCHAR(20)
    ,@age INT
    ,@city VARCHAR(20)
    ,@mk VARCHAR(20)
AS
CREATE asymmetric KEY mahoaluongi
    WITH algorithm = RSA_512 ENCRYPTION BY password = N'@mk'

INSERT INTO Emp@236186
VALUES (
    @name
    ,@age
    ,ENCRYPTBYASYMKEY(AsymKey_ID('mahoaluongi'), @city)
    )

DROP asymmetric KEY mahoaluongi
GO

旁注:存储过程不应使用
sp
前缀。微软已经这样做了,而且你确实有可能在将来的某个时候发生名称冲突。最好只是简单地避免使用
sp.
并使用其他东西作为前缀,或者根本不使用前缀!每次在
nhanvien
中插入新记录并删除它时,创建一个新的非对称密钥不是一个好主意。之后您将如何解密数据?@ughai我使用_mk作为密码登录并加密另一列。因此,我需要在存储过程中对其进行加密,因为它在encryptbyasymkey中仍然具有“无效列名Mahoalongi”function@QuangVĩnhHá。我改了密码。请再次检查。请考虑向代码中添加说明,以便我们理解为什么它解决了OP问题。
ALTER PROCEDURE SP_INS_ENCRYPTED_KEY @name VARCHAR(20)
    ,@age INT
    ,@city VARCHAR(20)
    ,@mk VARCHAR(20)
AS
CREATE asymmetric KEY mahoaluongi
    WITH algorithm = RSA_512 ENCRYPTION BY password = N'@mk'

INSERT INTO Emp@236186
VALUES (
    @name
    ,@age
    ,ENCRYPTBYASYMKEY(AsymKey_ID('mahoaluongi'), @city)
    )

DROP asymmetric KEY mahoaluongi
GO
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