【问题标题】:Create Asymmetric key in SQL using a variable password (from stored procedure)使用变量密码在 SQL 中创建非对称密钥(来自存储过程)
【发布时间】:2015-07-16 01:01:50
【问题描述】:
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。

但是使用castconvert 将varchar 转换为STRING 是不可能的。

我使用的是 SQL Server 2014

【问题讨论】:

  • 旁注:您应该为您的存储过程使用sp_ 前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免 sp_ 并使用其他东西作为前缀 - 或者根本不使用前缀!
  • 每次将新记录插入nhanvien 然后删除它时创建一个新的非对称密钥并不是一个好主意。之后你将如何解密数据?
  • @ughai 我使用 _mk 作为密码来登录并加密另一列。因此我需要在存储过程中对其进行加密

标签: sql sql-server stored-procedures encryption sql-server-2014


【解决方案1】:

我建议使用 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')

【讨论】:

  • 但在 encryptbyasymkey 函数中仍有“无效的列名名称 mahoaluongi”
  • @QuangVĩnhHà。我改变了我的代码。请再次检查。
【解决方案2】:
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

【讨论】:

    【解决方案3】:

    试试这个:

    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
    

    【讨论】:

    • 请考虑在代码中添加描述,以便我们了解为什么它解决了操作的问题
    猜你喜欢
    • 1970-01-01
    • 2015-12-07
    • 2013-02-18
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2010-10-30
    相关资源
    最近更新 更多