对于中小型公司来说,什么是最合适的加密? '该数据库

本文关键字:加密 数据库 公司 中小型 什么 | 更新日期: 2023-09-27 18:06:14

我想实现加密,因为有多个人可以访问数据库,我的公司希望在我的应用程序中存储人员(敏感)信息。为了创建一些分离和安全性,我想理想地使用他们选择的"密钥"来加密一个SQL表中的数据。

我知道自己这样做,我会错过一个技巧和尝试和测试可能是最好的,特别是对于我们这样规模的公司,我们不需要担心太多的黑客,因为数据库是不可外部访问的。刚好够把感兴趣的人挡在外面。

我想知道什么级别的安全是合适的,我也有点迷失了什么,甚至谷歌找到什么样的加密可能在第三方插件我需要使用,因为他们都想销售他们的产品,他们都会说他们自己的是伟大的?

我能找到的大多数其他问题和建议的"类似问题"都谈到了数据传输加密,哈希或ASP。净

对于中小型公司来说,什么是最合适的加密? '该数据库

所有的安全性实际上都是关于提高标准和可用性的权衡。对于加密,这里有很多选项,但它实际上都归结为密钥管理。

谁有解密的密钥?

它们是如何存储的?

对你的应用程序数据的暴力攻击(比如他们通过拦截你的联邦快递到铁山获得加密的SQL Server数据库的备份磁带)比对密钥管理系统的内部攻击更不可能-例如员工或开发人员修改程序来解密和转储数据。

由于应用程序通常必须随时向授权用户解密这些数据,因此我可能首先关注敏感列的可见性以及允许访问它们的角色,然后再考虑对它们进行加密。

SQL Server只提供对数据的透明加密以及对连接的加密。如果用户对表具有SELECT *访问权限,那么这是没有用的。在SQL Server不知情的情况下在列中加密它可能会有问题。例如,如果一列是工资数据,这是敏感的,如果你在一列中加密它,你不能只运行SELECT Employee, SUM(Pay) GROUP BY Employee

因此,首先我要确保您已经确定了应用程序中的用户和角色,检查了他们拥有的访问权限,并确保所有到数据库的连接都使用适当的角色。

我个人建议使用AES,因为它很容易实现,而且它是敏感的个人数据,可以提供足够的加密,不像DES这样的东西。

如果您想从技术上了解AES的工作原理,本文将深入介绍它:http://msdn.microsoft.com/en-us/magazine/cc164055.aspx以及附带的基本示例:http://msdn.microsoft.com/en-us/magazine/cc164846.aspx

如何实现它的一个非常干净的例子是在这里:http://www.obviex.com/samples/Code.aspx?Source=EncryptionCS&Title=Symmetric%20Key%20Encryption&Lang=C%23

示例简化(防止链接失效)

using System;
using System.IO;
using System.Security.Cryptography;
namespace RijndaelManaged_Examples
{
    class RijndaelMemoryExample
    {
        public static void Main()
        {
            try
            {
                string original = "Here is some data to encrypt!";
                // Create a new instance of the RijndaelManaged
                // class.  This generates a new key and initialization 
                // vector (IV).
                RijndaelManaged myRijndael = new RijndaelManaged();
                // Encrypt the string to an array of bytes.
                byte[] encrypted = encryptStringToBytes_AES(original, myRijndael.Key, myRijndael.IV);  
                // Decrypt the bytes to a string.
                string roundtrip = decryptStringFromBytes_AES(encrypted, myRijndael.Key, myRijndael.IV);
                //Display the original data and the decrypted data.
                Console.WriteLine("Original:   {0}", original);
                Console.WriteLine("Round Trip: {0}", roundtrip);
            }
            catch (Exception e)
            {
                Console.WriteLine("Error: {0}", e.Message);
            }
        }
        static byte[] encryptStringToBytes_AES(string plainText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0)
                throw new ArgumentNullException("plainText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            // Declare the streams used
            // to encrypt to an in memory
            // array of bytes.
            MemoryStream    msEncrypt   = null;
            CryptoStream    csEncrypt   = null;
            StreamWriter    swEncrypt   = null;
            // Declare the RijndaelManaged object
            // used to encrypt the data.
            RijndaelManaged aesAlg      = null;
            try
            {
                // Create a RijndaelManaged object
                // with the specified key and IV.
                aesAlg = new RijndaelManaged();
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                // Create a decrytor to perform the stream transform.
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
                // Create the streams used for encryption.
                msEncrypt = new MemoryStream();
                csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
                swEncrypt = new StreamWriter(csEncrypt);
                //Write all data to the stream.
                swEncrypt.Write(plainText);
            }
            finally
            {
                // Clean things up.
                // Close the streams.
                if(swEncrypt != null)
                    swEncrypt.Close();
                if (csEncrypt != null)
                    csEncrypt.Close();
                if (msEncrypt != null)
                    msEncrypt.Close();
                // Clear the RijndaelManaged object.
                if (aesAlg != null)
                    aesAlg.Clear();
            }
            // Return the encrypted bytes from the memory stream.
            return msEncrypt.ToArray();
        }
        static string decryptStringFromBytes_AES(byte[] cipherText, byte[] Key, byte[] IV)
        {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (Key == null || Key.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("Key");
            // TDeclare the streams used
            // to decrypt to an in memory
            // array of bytes.
            MemoryStream    msDecrypt   = null;
            CryptoStream    csDecrypt   = null;
            StreamReader    srDecrypt   = null;
            // Declare the RijndaelManaged object
            // used to decrypt the data.
            RijndaelManaged aesAlg      = null;
            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;
            try
            {
                // Create a RijndaelManaged object
                // with the specified key and IV.
                aesAlg = new RijndaelManaged();
                aesAlg.Key = Key;
                aesAlg.IV = IV;
                // Create a decrytor to perform the stream transform.
                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
                // Create the streams used for decryption.
                msDecrypt = new MemoryStream(cipherText);
                csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
                srDecrypt = new StreamReader(csDecrypt);
                // Read the decrypted bytes from the decrypting stream
                // and place them in a string.
                plaintext = srDecrypt.ReadToEnd();
            }
            finally
            {
                // Clean things up.
                // Close the streams.
                if (srDecrypt != null)
                    srDecrypt.Close();
                if (csDecrypt != null)
                    csDecrypt.Close();
                if (msDecrypt != null)
                    msDecrypt.Close();
                // Clear the RijndaelManaged object.
                if (aesAlg != null)
                    aesAlg.Clear();
            }
            return plaintext;
        }
    }
}

混乱信息可以用对称(Rijndael)密钥完成,但我不知道使用SQL更新的应用程序的性能提高了多少。

Symmetric (Rijndael) Key