数据库专家答疑目录

  |  手机版

收藏网站

投稿QQ:1745232315

IT专家网,汇聚专业声音 解析IT潮流 IT专家网,汇聚专业声音 解析IT潮流

网络

专家视点在现场环球瞭望
IT专家网 > 数据库子站 > 数据库专家答疑目录

使用带有SQL Server加密技术的认证

作者:唐小若出处:IT专家网2009-06-02 08:00

  专家解答

  认证是通过加密的其它数据以及以加密方式存储的数据。提到加密数据,如果没有指定正确的认证,那么SQL Server不会返回以解密方式存在的数据。而且,如果使用了错误的密钥,还会返回一个NULL值。例如,考虑存储信用卡密码的情形。如果在获取信用卡时没有传递正确的安全代码,那么就不可能得到信用卡密码。

  首先我们需要做的时确定我们有正对这个过程的主码、认证和对称密钥。下面的代码将创建你在数据库中测试的这些对象:

  --创建数据库主码,用它来加密证书密钥

  

     CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'SomeStr0ngPassw0rd!';

  GO

  --创建认证,用它来加密对称密钥

  

      CREATE CERTIFICATE EncryptKeyForCreditCard

  WITH SUBJECT = 'Certificate Used to Encrypt Symmetric Key for credit card number handling';

  GO

  --创建对称密钥

  

      CREATE SYMMETRIC KEY CreditCardEncryptionKey

  WITH ALGORITHM = AES_256

  ENCRYPTION BY CERTIFICATE EncryptKeyForCreditCard;

  GO

  下面的脚本创建了一张表和一个存储过程来描述这个问题。

  /*创建表来存储信用卡信息。

  通常我们有一个外码CustomerID参照用户表。尽管如此,在这个实例中我们不会创建这样一个外码。

  

      CREATE TABLE dbo.CreditCard (

  CreditCardID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,

  CustomerID INT NOT NULL,

  CardFriendlyName VARCHAR(50) NOT NULL,

  NameOnCard VARCHAR(100) NOT NULL,

  ExpirationDate SMALLDATETIME NOT NULL,

  CardNumber VARBINARY(128) NOT NULL

  );

  GO

  CREATE PROC dbo.InsertCard

  @CustomerID INT,

  @CardFriendlyName VARCHAR(50),

  @NameOnCard VARCHAR(100),

  @ExpirationDate SMALLDATETIME,

  @CardNumber CHAR(16),

  @SecurityCode CHAR(3)

  AS

  BEGIN

  OPEN SYMMETRIC KEY CreditCardEncryptionKey DECRYPTION BY CERTIFICATE EncryptKeyForCreditCard;

  INSERT INTO dbo.CreditCard

  (CustomerID, CardFriendlyName, NameOnCard, ExpirationDate, CardNumber)

  VALUES

  (@CustomerID, @CardFriendlyName, @NameOnCard, @ExpirationDate,

  EncryptByKey(Key_GUID('CreditCardEncryptionKey'), @CardNumber, 1, @SecurityCode) );

  CLOSE SYMMETRIC KEY CreditCardEncryptionKey;

  END;

  GO

  CREATE PROC dbo.RetrieveCard

  @CustomerID INT,

  @CardFriendlyName VARCHAR(50),

  @SecurityCode CHAR(3)

  AS

  BEGIN

  SELECT NameOnCard, ExpirationDate,

  CONVERT(CHAR(16), DecryptByKeyAutoCert(cert_ID('EncryptKeyForCreditCard'), NULL, CardNumber, 1, @SecurityCode)) AS CardNumber

  FROM dbo.CreditCard

  WHERE CustomerID = @CustomerID

  AND CardFriendlyName = @CardFriendlyName;

  END;

  GO

相关文章

关键词: 技巧,环球瞭望

责任编辑:包春林

专题推荐

原创文章

微博互动

白皮书

网警备案