zoukankan      html  css  js  c++  java
  • 数据加密 第四篇:对称密钥

    密钥分为对称密钥和非对称密钥,密钥本质上是加密数据的算法:

    • 对称密钥(Symmetric Keys)是指加密和解密的过程使用相同的算法,是加密中最弱的算法,但是性能最好。对于对称密钥,可以使用密码或者另一个密钥甚至一个证书来加密。
    • 非对称密钥(Asymmetric Keys)使用一对密钥(算法),一个密钥用于加密,另一个密钥用于解密,加密的密钥称为私钥(private key),解密的密钥称为公钥(public key)。

    不管对称密钥,还是非对称密钥,都不能备份。在加密体系中,能够备份的只有SMK、DMK和证书。

    对称密钥(Symmetric Keys)

    对称密钥是指数据的加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。不过即使是最弱的算法,也能增加数据防御的能力,毕竟不是每个攻击者都是顶级的。对于对称密钥,可以使用密码,或者另一个密钥,甚至一个证书来加密。

    一,创建对称密钥

    创建对称密钥时,需要制定对数据进行加密的算法,对称密钥必须用至少一个方式来加密:certificate, password, symmetric key, asymmetric key, 或 PROVIDER,密钥可以同时有多种加密方式。

    CREATE SYMMETRIC KEY key_name   
    WITH ALGORITHM = { AES_128 | AES_192 | AES_256 }
         , ENCRYPTION BY <encrypting_mechanism> [ , ... n ] 
      
    <encrypting_mechanism> ::=  
          CERTIFICATE certificate_name   
        | PASSWORD = 'password'   
        | SYMMETRIC KEY symmetric_key_name   
        | ASYMMETRIC KEY asym_key_name  

    举个例子,创建一个对称密钥,使用AES_256对数据进行加密,并使用证书对密钥进行加密:

    CREATE SYMMETRIC KEY JanainaKey09   
    WITH ALGORITHM = AES_256  
    ENCRYPTION BY CERTIFICATE Shipping04;  
    GO  

    二,使用对称密钥来加密和解密数据的函数

    在对称密钥创建完成之后,要使用对称密钥对数据进行加密,首先要打开对称密钥,对称密钥的GUID可以通过函数key_GUID('name')来获得:

    OPEN SYMMETRIC KEY Key_name DECRYPTION BY <decryption_mechanism>  
      
    <decryption_mechanism> ::=  
        CERTIFICATE certificate_name [ WITH PASSWORD = 'password' ]  
        | ASYMMETRIC KEY asym_key_name [ WITH PASSWORD = 'password' ]  
        | SYMMETRIC KEY decrypting_Key_name  
        | PASSWORD = 'decryption_password'  

    当对称密钥打开之后,使用EncryptByKey ()来对数据进行加密,返回值是varbinar,最大长度是8000Bytes:

    EncryptByKey ( key_GUID , { 'cleartext' | @cleartext }  
        [, { add_authenticator | @add_authenticator }  
         , { authenticator | @authenticator } ] ) 

    使用DecryptByKey ()来对数据进行解密:

    DecryptByKey ( { 'ciphertext' | @ciphertext }   
        [ , add_authenticator, { authenticator | @authenticator } ] ) 

    在不使用对称密钥时,把密钥关闭:

    CLOSE SYMMETRIC KEY key_name

    三,使用对称密钥来加密和解密数据的实例

    创建证书来对对称密钥进行加密。

    1,使用对称密钥加密数据

    Step1,创建证书,并使用数据库主密钥来加密证书

    CREATE CERTIFICATE CreditCardCert 
    WITH SUBJECT = 'Credit Card Numbers';

    Step2:创建对称密钥

    创建一个名称为CreditCardKey的对称密钥,使用AES_128加密算法,并使用证书对密钥进行加密

    CREATE SYMMETRIC KEY CreditCardKey 
    WITH ALGORITHM = AES_128
    ENCRYPTION BY CERTIFICATE CreditCardCert; 

    从 SQL Server 2016开始,除 AES_128、AES_192 和 AES_256 以外的所有算法都已过时。

    Step 3:解密对称密钥并使其可供使用

    使用密钥前需要解密对称密钥,然后打开密钥,否则密钥不可用

    OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE CreditCardCert; 

    Step4:使用密钥对数据进行加密

    调用ENCRYPTBYKEY()函数使用对称密钥对数据进行加密

    UPDATE Sales.CreditCard 
    SET CardNumberEncrypted = ENCRYPTBYKEY(Key_GUID('CreditCardKey'), CardNumber); 

    函数 KEY_GUID('key_name')返回对称密钥的GUID。

    Step 5:关闭密钥

    密钥的打开状态对当前Session起作用,在使用玩密钥之后,应该及时把密钥关闭。

    CLOSE SYMMETRIC KEY CreditCardKey ;

    2,解密对称密钥

    首先打开对称密钥,然后使用对称密钥解密数据,最后关闭密钥

    OPEN SYMMETRIC KEY CreditCardKey DECRYPTION BY CERTIFICATE CreditCardCert; 
     
    SELECT CONVERT(NVARCHAR(30), DECRYPTBYKEY(CardNumberEncrypted)) AS CreditCardNumber 
    FROM Sales.CreditCard ; 
    
    CLOSE SYMMETRIC KEY CreditCardKey ; 

    四,对称密钥的使用

    在使用对称密钥时,信息的发送方和接收方用一个密钥去加密和解密数据,它的最大优势是加/解密速度快,适合于对大数据量进行加密,对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

    对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。密钥的大小既要照顾到安全性,也要照顾到效率,是一个trade-off。

    对称加密的一大缺点是密钥的管理与分配,换句话说,如何把密钥发送到需要解密你的消息的人的手里是一个问题。在发送密钥的过程中,密钥有很大的风险会被黑客们拦截。现实中通常的做法是将对称加密的密钥进行非对称加密,然后传送给需要它的人。

    参考文档:

     CREATE SYMMETRIC KEY (Transact-SQL)

  • 相关阅读:
    汇编-MOV指令
    mfc 线程的优先级
    golang图片裁剪和缩略图生成
    libnsq编译、使用记录
    c日志宏
    golang 六宫格、九宫格头像生成
    使用httputil中ReverseProxy反向代理遇到的坑
    Nginx反向代理与Backend直接配置长连接
    openssl:AES CBC PKCS5 加解密 (C/GOLANG)
    纯C:AES256
  • 原文地址:https://www.cnblogs.com/ljhdo/p/4543767.html
Copyright © 2011-2022 走看看