Какое шифрование является наиболее подходящим для базы данных MSSQL малых и средних компаний? - PullRequest
1 голос
/ 22 августа 2011

Я хочу внедрить шифрование, так как есть несколько человек, имеющих доступ к базе данных, и моя компания хочет хранить личную (конфиденциальную) информацию в моем приложении.Чтобы создать какое-то разделение и безопасность, я хочу реализовать шифрование, в идеале используя «ключ», который они выбирают для шифрования данных в одной таблице SQL.

Я знаю, что делая это сам, я собираюсь пропустить трюк и попробовалИ-протестированный, вероятно, лучше всего, особенно для компании нашего размера, где нам не нужно слишком беспокоиться о хакерах, поскольку БД не доступна извне.Достаточно, чтобы не пускать заинтересованные стороны.

Я хотел бы знать, какой уровень безопасности является подходящим, а также я немного растерялся относительно того, что даже Google может выяснить, какой тип шифрования может быть в стороннем плагинеМне нужно использовать, поскольку все они хотят продать свой продукт, они все скажут, что их собственный продукт - это здорово?

Большинство других вопросов, которые я мог найти, и предлагаемые «Похожие вопросы» говорили о шифровании передачи данных, хешированииили ASP.NET

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Вся безопасность на самом деле заключается в повышении планки и компромиссов юзабилити. С шифрованием здесь есть много вариантов, но на самом деле все сводится к управлению ключами.

У кого есть ключи для расшифровки?

Как они хранятся?

Атаки с применением грубой силы на данные вашего приложения (скажем, они захватывают ленту резервных копий зашифрованной базы данных SQL Server путем перехвата FedEx в Iron Mountain) реже, чем внутренняя атака на систему управления ключами, например сотрудник или разработчик изменяет программу для расшифровки и вывода данных.

Поскольку приложение, вероятно, в общем случае должно дешифровать эти данные в любое время авторизованным пользователям, я бы, вероятно, сосредоточился на видимости чувствительных столбцов и ролях, которым разрешен доступ к ним, а затем позаботился о шифровании.

SQL Server предлагает только прозрачное шифрование данных и шифрование соединений. Это бесполезно, если у пользователей есть SELECT * доступ к таблице. Самостоятельное шифрование в столбце без ведома SQL Server может быть проблематичным. Например, если один столбец является платными данными и является конфиденциальным, если вы зашифруете его в столбце, вы не сможете просто запустить SELECT Employee, SUM(Pay) GROUP BY Employee

Итак, сначала я хотел бы убедиться, что вы определили пользователей и роли в вашем приложении, проанализировать, какой у них доступ, и убедиться, что все соединения с базой данных используют соответствующие роли.

1 голос
/ 23 августа 2011

Лично я бы порекомендовал использовать 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;

        }
    }
}
0 голосов
/ 22 августа 2011

Информация о скремблировании может быть получена с помощью симметричного (Rijndael) ключа, но я не знаю, насколько значительно повысить производительность приложения, использующего обновление SQL.

Симметричный (Rijndael) ключ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...