【问题标题】:Encrypt Varbinary in MSSQL在 MSSQL 中加密 Varbinary
【发布时间】:2018-03-22 17:21:38
【问题描述】:

由于我们将来会在数据库中存储一些敏感文件,因此我们希望对它们进行加密。尽管我们倾向于使用 Varbinary,但我们仍然在 Filestream 和 Varbinary 之间犹豫不决。我发现这个链接很有帮助:file stream vs local save in sql server?

我现在能看到的唯一方法是将 Varbinary 转换为字符串并使用以下函数对其进行加密:Encrypting & Decrypting a String in C#

还有更好的可能性吗?

【问题讨论】:

  • 您可以在保存到数据库之前加密byte[]
  • 不,绝对没有需要将二进制数据转换成字符串来加密和解密。任何基于字符串的东西都会有一个“首先将字符串转换为二进制数据”的步骤 - 只需删除它。
  • 加密不是你挥舞的魔杖,它使事情变得安全。 谁/什么您想保护这些数据免受攻击?

标签: c# sql-server encryption


【解决方案1】:

VARBINARY 类型类似于 VARCHAR 类型,但存储的是二进制字节字符串而不是非二进制字符串。

尝试使用 SQL Server 证书和非对称密钥,这是使用证书以及私钥和公钥加密数据的最安全方法。 如需进一步说明,您可以访问以下链接:

https://blog.sqlauthority.com/2009/04/28/sql-server-introduction-to-sql-server-encryption-and-symmetric-key-encryption-tutorial-with-script/

https://docs.microsoft.com/en-us/sql/relational-databases/security/sql-server-certificates-and-asymmetric-keys

【讨论】:

    【解决方案2】:

    -- 选项一

        
        -- add varbinary field to table
        ALTER TABLE [dbo].[enc_test]
            ADD encryptedCol varbinary(128);
            GO  
        
        -- Create cert
        CREATE CERTIFICATE testCert01
           WITH SUBJECT = 'Test',   
           EXPIRY_DATE = '20251031';  
        GO  
    
        -- Create key
        CREATE SYMMETRIC KEY testKey01   
        WITH ALGORITHM = AES_256  
        ENCRYPTION BY CERTIFICATE testCert01;  
        GO      
    
        -- Update table with encrypted value 
        OPEN SYMMETRIC KEY testKey01  
           DECRYPTION BY CERTIFICATE testCert01;    
    
        UPDATE [dbo].[enc_test]
        SET encryptedCol  
            = EncryptByKey(Key_GUID('testKey01'), 'plain text test');  
        GO      
    
        -- view Encrypted Column
        SELECT * FROM [dbo].[enc_test];     
        
        -- View Decrypted Column
        OPEN SYMMETRIC KEY testKey01  
          DECRYPTION BY CERTIFICATE testCert01; 
    
        SELECT *, Convert(varchar, (DECRYPTBYKEY(encryptedCol))) 
        FROM [dbo].[enc_test];
    
    

    -- 选项 2(包括证书级别密码)

    
        -- add varbinary field to table
        ALTER TABLE [dbo].[enc_test]
            ADD encryptedCol varbinary(128);
            GO  
    
        -- Create PW protected cert
        CREATE CERTIFICATE testCert01
            ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
           WITH SUBJECT = 'Test',   
           EXPIRY_DATE = '20251031';  
        GO  
    
        -- Create KEY
        CREATE SYMMETRIC KEY testKey01   
        WITH ALGORITHM = AES_256  
        ENCRYPTION BY CERTIFICATE testCert01;  
        GO      
    
        -- Update table with encrypted value 
        OPEN SYMMETRIC KEY testKey01  
           DECRYPTION BY CERTIFICATE testCert01 WITH PASSWORD = 'pGFD4bb925DGvbd2439587y';  
    
        UPDATE [dbo].[enc_test]
        SET encryptedCol  
            = EncryptByKey(Key_GUID('testKey01'), 'plain text test');  
        GO      
    
        -- view Encrypted Column
        SELECT * FROM [dbo].[enc_test];     
        
        -- View Decrypted Column
        OPEN SYMMETRIC KEY testKey01  
          DECRYPTION BY CERTIFICATE testCert01 WITH PASSWORD = 'pGFD4bb925DGvbd2439587y';   
    
        SELECT *, Convert(varchar, (DECRYPTBYKEY(encryptedCol))) 
        FROM [dbo].[enc_test];
    

    【讨论】:

      猜你喜欢
      • 2014-02-28
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-05
      • 1970-01-01
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多