腾讯云数据库团队,字符串加密

====对称加密(向量)=====

腾讯云数据库团队,字符串加密。SQL Server 数据加密功效解析

 

转载自: 腾云阁 

多少加密是数据库被破解、物理介质被盗、备份被窃取的末尾一道防线,数据加密,1方面消除数量被窃取安全难题,另1方面有关法律须要强制加密数据。SQL
Server
的数码加密相较于其余数据库,作用相对圆满,加密办法较多。平常来讲,数据加密分为对称加密和非对称加密。对称加密:加密与解密使用相同密钥,密钥须求传输,安全性较弱,但质量较非对称要好。非对称加密:加密与解密使用区别密钥(公钥和私钥),较对称密钥安全性较好,然则算法较复杂,带来质量上的损失。因而,折中的方法是行使对称密钥加密数据,使用非对称密钥加密对称密钥。那样既保障高品质,又加强密钥的可相信性。

同样,SQL Server 就动用了折中的方法,所以SQL
Server 加密成效包蕴一个部分:数据加密和密钥管理

 

 

一.数据加密

情商数据加密,大家只好说下加密算法,SQL Server辅助多样加密算法:

美高梅开户网址 1

 

2.密钥管理

1.SQL Server加密层次结构

美高梅开户网址 2
由图能够见到,加密是分层级的。每3个数据库实例都存有3个服务主密钥(ServiceMaster
Key),那个密钥是实例的根密钥,在实例安装的时候自动生成,其自己由Windows提供的数量爱抚API进行保护(Data
Pertection
API),服务主密钥除了为其子节点提供加密服务之外,还用于加密一些实例级其余新闻,比如实例的登录名密码照旧链接服务器的新闻。

在劳务主密钥之下的是数据库主密钥(Database Master
Key),那一个密钥由劳动主密钥举办加密。那是叁个数据库级别的密钥,能够用于为开创数据库级别的注明或非对称密钥提供加密,每3个数据库只好有二个数据库主密钥。

EKM模块,这几个相比较特别,全称可扩展密钥管理模块,该意义增强sqlserver密钥管理的能力,允许将密钥存款和储蓄到数据库之外,包含部分硬件,如智能卡、USB设备或硬件安全模块(HSM);并且同意行使第一方产品来治本密钥和展开加密;其它,有标准化的能够利用更加高品质的HSM模块来加解密,收缩加解密上质量的损失。

 

二.SQL Server加密情势

对象定义加密

未确认保证触发器、存款和储蓄进度、视图等概念音信,大家得以在概念sqlserver对象的时候添加WITH
ENC途观YPTION字段来加密对象。

 

列数据加密

经过函数加密表中的某1列数据。能够由此密码、对称密钥、非对称密钥、证书等4中艺术加密。当中,还包罗带有验证器的加密函数,验证器用来化解密文替换难点,验证器一般选择不更改独一无二的id,那样固然密文替换,验证器不对,一样没戏。

 

总是加密

透过证书的秘诀对ssl连接加密,壹般用于镜像,客户端和SQL
Server之间的连年就是通过那种办法,幸免黑客窃取客户端和数据库之间的出殡的数目。

 

TDE透明数据加密(二〇一〇)

晶莹剔透数据加密,顾名思义,是在用户不感知的情形下达成加解密操作。
它的加密是在页级别举行,是在写入磁盘前加密,读入内部存款和储蓄器时解密,针对数据和日志文件,做到实时I/O加密,并且备份文件也会联合加密。
密钥存在数据库指引记录中,收到证件只怕非对称密钥的护卫,也能够与EKM模块1同使用。官方说法,额外占用三%-伍%的cpu能源。
TDE也有1些通病:
压缩率小,由于它是先加密再压缩的,所以不可能一目掌握滑坡备份。
备份同样是加密的,全部恢复生机的时候要小心,注意备份证书和密钥,才能在另个实例中还原数据库
属性有早晚损耗

 

备份加密(201四)

支撑备份的经过中开始展览加密,并且帮助先削减在加密,保持高压缩比,打破了运用透明数据加密后大约从未压缩率的窘况。
故此,使用原生备份加密无论在将数据备份到异地数据基本,依旧将数据备份到云端,都能够以相当的低的血本对数码提供额外的安全保险。

 

全程加密AlwaysEncrypted(201陆)

全程加密,数据永远是加密事态,你能够在加密数量上进行操作,无需先对它们解密,相当于说加密的机敏新闻不会有空子变成明文。
全程加密针对列做处理,在开立列主密钥,列加密密钥后,能够在创造表的时候设置列加密。
加密格局分为二种:明确型加密与随机型加密。
明显型加密能够确定保证对某些值加密后的结果是始终相同的,那就允许使用者对该数量列实行等值比较、连接及分组操作。分明型加密的败笔在于有十分的大恐怕估摸出原来的小说,而随机型加密能够确定保障有些给定值在任意三遍加密后的结果三番五次不一样的,从而杜绝了猜出原值的只怕。官方建议供给寻找和分组的列使用明确性加密,而注释和其他敏感不会进展搜寻分组的音讯运用随机性加密。

 

便民md5加密:

        //SymmetricAlgorithm 所有对称算法的实现都必须从中继承的抽象基类
        private SymmetricAlgorithm mobjCryptoService;
        private string key;
        public Encrypt()
        {
            mobjCryptoService = new RijndaelManaged();
            key = "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7";//自定义的密串
        }
        /// <summary>
        /// 获得密钥
        /// </summary>
        /// <returns>密钥</returns>
        private byte[] GetLegalKey()
        {
            string sTemp = key;
            mobjCryptoService.GenerateKey();// 当在派生类中重写时,生成用于该算法的随机密钥
            byte[] bytTemp = mobjCryptoService.Key;
            int KeyLength = bytTemp.Length;
            if (sTemp.Length > KeyLength)
                sTemp = sTemp.Substring(0, KeyLength);
            else if (sTemp.Length < KeyLength)
                sTemp = sTemp.PadRight(KeyLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        /// <summary>
        /// 获得初始向量IV
        /// </summary>
        /// <returns>初试向量IV</returns>
        private byte[] GetLegalIV()
        {
            string sTemp = "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk";
            mobjCryptoService.GenerateIV();
            byte[] bytTemp = mobjCryptoService.IV;// 获取或设置对称算法的初始化向量
            int IVLength = bytTemp.Length;//获得一个 32 位整数,表示 System.Array 的所有维数中元素的总数
            if (sTemp.Length > IVLength)
                sTemp = sTemp.Substring(0, IVLength);
            else if (sTemp.Length < IVLength)
                sTemp = sTemp.PadRight(IVLength, ' ');
            return ASCIIEncoding.ASCII.GetBytes(sTemp);
        }
        /// <summary>
        /// 加密方法(请先实例化Encrypt类)
        /// </summary>
        /// <param name="Source">待加密的串</param>
        /// <returns>经过加密的串</returns>
        public string EncrypStrByIV(string Source)
        {
            byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source);
            MemoryStream ms = new MemoryStream();
            mobjCryptoService.Key = GetLegalKey();
            mobjCryptoService.IV = GetLegalIV();
            ICryptoTransform encrypto = mobjCryptoService.CreateEncryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Write);
            cs.Write(bytIn, 0, bytIn.Length);
            cs.FlushFinalBlock();
            ms.Close();
            byte[] bytOut = ms.ToArray();
            return Convert.ToBase64String(bytOut);
        }
        /// <summary>
        /// 解密方法(请先实例化Encrypt类)
        /// </summary>
        /// <param name="Source">待解密的串</param>
        /// <returns>经过解密的串</returns>
        public string DecrypStrByIV(string Source)
        {
            byte[] bytIn = Convert.FromBase64String(Source);
            MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length);
            mobjCryptoService.Key = GetLegalKey();
            mobjCryptoService.IV = GetLegalIV();
            ICryptoTransform encrypto = mobjCryptoService.CreateDecryptor();
            CryptoStream cs = new CryptoStream(ms, encrypto, CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cs);
            return sr.ReadToEnd();
        }

美高梅开户网址 3

数量加密是数据库被破解、物理介质被盗、备份被窃取的结尾一道防线,数据加密,一方面缓解数量被窃取安全题材,另壹方面有关法规须要强制加密数据。SQL
Server
的数额加密相较于其余数据库,成效相对完善,加密办法较多。常常来讲,数据加密分为对称加密和非对称加密。对称加密:加密与解密使用同一密钥,密钥供给传输,安全性较弱,但质量较非对称要好。非对称加密:加密与解密使用不相同密钥(公钥和私钥),较对称密钥安全性较好,可是算法较复杂,带来品质上的损失。因而,折中的方法是应用对称密钥加密数据,使用非对称密钥加密对称密钥。那样既保障高品质,又增强密钥的可相信性。

 ========DES加密========

百度md5加密:

一样,SQL Server 就选取了折中的方法,所以SQL Server
加密功能包含一个部分:数据加密和密钥管理

        /// <summary>
        /// DES加密
        /// </summary>
        /// <param name="Text">待加密的字符串</param>
        /// <returns>加密后的字符串</returns>
        public static string DESEncrypt(string Text)
        {
            return DESEncrypt(Text, "ijnskijnse");
        }

        /// <summary> 
        /// DES加密数据 
        /// </summary> 
        /// <param name="Text">待加密的字符串</param> 
        /// <param name="sKey">加密密钥</param> 
        /// <returns>加密后的字符串</returns> 
        public static string DESEncrypt(string Text, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray;
            inputByteArray = Encoding.Default.GetBytes(Text);
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat("{0:X2}", b);
            }
            return ret.ToString();
        }




        /// <summary>
        /// DES解密
        /// </summary>
        /// <param name="Text">待解密的字符串</param>
        /// <returns>解密后的明文</returns>
        public static string DESDecrypt(string Text)
        {
            return DESDecrypt(Text, "ijnskijnse");
        }

        /// <summary> 
        /// DES解密数据 
        /// </summary> 
        /// <param name="Text">待解密的字符串</param> 
        /// <param name="sKey">解密密钥</param> 
        /// <returns>解密后的明文</returns> 
        public static string DESDecrypt(string Text, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            int len;
            len = Text.Length / 2;
            byte[] inputByteArray = new byte[len];
            int x, i;
            for (x = 0; x < len; x++)
            {
                i = Convert.ToInt32(Text.Substring(x * 2, 2), 16);
                inputByteArray[x] = (byte)i;
            }
            des.Key = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            des.IV = ASCIIEncoding.ASCII.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(sKey, "md5").Substring(0, 8));
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Encoding.Default.GetString(ms.ToArray());
        }

美高梅开户网址 4

1.数额加密

 ====倒序加一加密解密====

 

磋商数据加密,咱们只可以说下加密算法,SQL Server帮助多种加密算法:

 /// <summary>
        /// 倒序加1加密
        /// </summary>
        /// <param name="rs"></param>
        /// <returns></returns>
        public static string EncryptOrderStr(string rs) //倒序加1加密 
        {
            byte[] by = new byte[rs.Length];
            for (int i = 0; i <= rs.Length - 1; i++)
            {
                by[i] = (byte)((byte)rs[i] + 1);
            }
            rs = "";
            for (int i = by.Length - 1; i >= 0; i--)
            {
                rs += ((char)by[i]).ToString();
            }
            return rs;
        }
        /// <summary>
        /// 顺序减1解码 
        /// </summary>
        /// <param name="rs"></param>
        /// <returns></returns>
        public static string DecryptOrderStr(string rs) //顺序减1解码 
        {
            byte[] by = new byte[rs.Length];
            for (int i = 0; i <= rs.Length - 1; i++)
            {
                by[i] = (byte)((byte)rs[i] - 1);
            }
            rs = "";
            for (int i = by.Length - 1; i >= 0; i--)
            {
                rs += ((char)by[i]).ToString();
            }
            return rs;
        }

MySQL

美高梅开户网址 5

======Base64编解码=====

加密码语言法

二.密钥管理:

        /// <summary>
        /// Base64编码
        /// </summary>
        /// <param name="code_type">编码类型</param>
        /// <param name="code">待编码的字符串</param>
        /// <returns></returns>
        public static string Base64Encode(string code_type, string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding(code_type).GetBytes(code);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = code;
            }
            return encode;
        }
        /// <summary>
        /// Base64解码
        /// </summary>
        /// <param name="code_type">编码类型</param>
        /// <param name="code">带解码的字符串</param>
        /// <returns></returns>
        public static string Base64Decode(string code_type, string code)
        {
            string decode = "";
            byte[] bytes = Convert.FromBase64String(code);
            try
            {
                decode = Encoding.GetEncoding(code_type).GetString(bytes);
            }
            catch
            {
                decode = code;
            }
            return decode;
        }

MD5(加密字符串)

一.SQL Server加密层次结构

 

 

美高梅开户网址 6

-- 中文加密
SELECT MD5('你好')

-- 中文加密匹配查询
SELECT * FROM 表名 WHERE 字段名 = MD5('你好')

由图可以见见,加密是分层级的。每一个数据库实例都有所三个服务主密钥(ServiceMaster
Key),那么些密钥是实例的根密钥,在实例安装的时候自动生成,其本人由Windows提供的多少爱戴API举办保证(Data
Pertection
API),服务主密钥除了为其子节点提供加密服务之外,还用于加密1些实例级别的新闻,比如实例的登录名密码照旧链接服务器的信息。 

加密结果:

在劳务主密钥之下的是数据库主密钥(Database Master
Key),这一个密钥由劳动主密钥举行加密。那是一个数据库级其余密钥,能够用来为制造数据库级别的证件或非对称密钥提供加密,每四个数据库只可以有3个数据库主密钥。

美高梅开户网址 7

EKM模块,那些相比特别,全称可扩充密钥管理模块,该意义增强sqlserver密钥管理的能力,允许将密钥存款和储蓄到数据库之外,包罗1些硬件,如智能卡、USB设备或硬件安全模块(HSM);并且同意使用第三方产品来保管密钥和开始展览加密;其余,有原则的能够动用更高品质的HSM模块来加解密,收缩加解密上品质的损失。

 

二.SQL Server加密艺术

 

  • 指标定义加密

SQLSERVER

未确定保证触发器、存款和储蓄进度、视图等概念音讯,我们能够在概念sqlserver对象的时候添加WITH
ENC宝马X3YPTION字段来加密对象。

加密码语言法

  • 列数据加密
substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','加密字符串')),3,32)

因而函数加密表中的某一列数据。能够通过密码、对称密钥、非对称密钥、证书等四中艺术加密。个中,还包含带有验证器的加密函数,验证器用来消除密文替换难题,验证器1般接纳不更改独一无二的id,那样就算密文替换,验证器不对,一样没戏。

 

  • 连日来加密
select substring(sys.fn_sqlvarbasetostr(HashBytes('MD5','你好')),3,32)

由此证书的措施对ssl连接加密,一般用于镜像,主从机器以前的总是就是经过那种艺术。

加密结果:

  • TDE(透明数据加密)

美高梅开户网址 8

透明数据加密,顾名思义,是在用户不感知的图景下形成加解密操作。它的加密是在页级别实行,是在写入磁盘前加密,读入内部存款和储蓄器时解密,针对数据和日志文件,做到实时I/O加密,并且备份文件也会联合加密。密钥存在数据库引导记录中,收到证件也许非对称密钥的掩护,也足以与EKM模块1同使用。官方说法,额外占用三%-5%的cpu财富。
TDE也有部分毛病:压缩率小,由于它是先加密再压缩的,所以不大概显著滑坡备份。备份同样是加密的,全部恢复生机的时候要小心,注意备份证书和密钥,才能在另个实例中还原数据库品质有早晚损耗

美高梅开户网址 ,因此可见sqlserver加密与百度加密依然有分其他.在不通晓在sqlserver怎么加密时,依然不要采纳sqlserver加密。至于字母、数字、英文特殊字符依旧得以用sqlserver加密的。

  • 备份加密(201肆)

 

帮忙备份的历程中实行加密,并且匡助先削减在加密,保持高压缩比,打破了动用透明数据加密后差不离一贯不压缩率的窘境。因而,使用原生备份加密无论在将数据备份到外边数据主导,还是将数据备份到云端,都能够以相当低的老本对数据提供额外的广安保持。

C# Md5加密:

  • 全程加密(201陆)

加密代码:

全程加密,数据永远是加密状态,你能够在加密数据上实施操作,无需先对它们解密,也正是说加密的机灵音信不会有机会变成明文。全程加密针对列做处理,在开创列主密钥,列加密密钥后,能够在创立表的时候设置列加密。加密形式分为二种:明确型加密与随机型加密。鲜明型加密能够确认保证对有些值加密后的结果是壹味相同的,那就允许使用者对该数据列进行等值比较、连接及分组操作。分明型加密的缺点在于有望估算出原版的书文,而随机型加密能够确认保证某些给定值在随意三次加密后的结果总是分化的,从而杜绝了猜出原值的恐怕性。官方提出必要寻找和分组的列使用明确性加密,而注释和别的敏感不会开始展览查找分组的音讯应用随机性加密。最终附上TDE开通示例: 

public static string Sign(string prestr, string _input_charset)
 {
     StringBuilder sb = new StringBuilder(32);
     System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
     byte[] t = md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(prestr));
     for (int i = 0; i < t.Length; i++)
     {
         sb.Append(t[i].ToString("x").PadLeft(2, '0'));
     }

     return sb.ToString();
 }

美高梅开户网址 9

加密结果:

参照链接:

美高梅开户网址 10

  • sqlserver加密:
  • 可增添密钥管理模块EKM
  • 透明数据加密TDE:

 

【编辑推荐】

 Java加密:

加密代码:

 

package com;

import java.security.MessageDigest;


public class Md5Test {

    public static void main(String[] args) {

        System.out.println(Md5("你好"));
    }

    public static String Md5(String str) {                            
        String re_md5 = new String();
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");

            byte[] data = str.getBytes("UTF-8");

            md.update(data);
            byte b[] = md.digest();

            int i;

            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < b.length; offset++) {
                i = b[offset];
                if (i < 0)
                    i += 256;
                if (i < 16)
                    buf.append("0");
                buf.append(Integer.toHexString(i));
            }

            re_md5 = buf.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }

       return re_md5;
    }
}

 

加密结果:

美高梅开户网址 11

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图