Тема: Безпека для БД

Якщо я буду шифрувати всі дані за допомогою якогось криптографічного алгоритму, "ключі" від якого буду зберігати на сервері у виконавчий скрипт, це буде безпечно ? Є в цьому якийсь сенс ? Можна захистити БД від "зливу" ?

Наприклад так
Збереження: Користувач передає дані -> Дані обробляються -> Encrypt(Дані)
Читання: Encrypt(Дані) -> Дані обробляються -> Виводяться користувачу 

class SecurityManagement
    {
        /* Харкодимо ключ */
        static readonly string PasswordHash = "ХХХХХХХХ";
        static readonly string SaltKey = "ХХХХХХХХ";
        static readonly string VIKey = "ХХХХХХХХХХХХХХХХ";

        /*Декриптування*/
        public static string Decrypt(string content)
        {
            byte[] cipherTextBytes = Convert.FromBase64String(content);
            byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
            var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };

            var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));
            var memoryStream = new MemoryStream(cipherTextBytes);
            var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read);
            byte[] plainTextBytes = new byte[cipherTextBytes.Length];

            int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
            memoryStream.Close();
            cryptoStream.Close();
            return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount).TrimEnd("\0".ToCharArray());
        }
         /*Криптування*/
        public static string Encrypt(string content)
        {
            byte[] plainTextBytes = Encoding.UTF8.GetBytes(content);

            byte[] keyBytes = new Rfc2898DeriveBytes(PasswordHash, Encoding.ASCII.GetBytes(SaltKey)).GetBytes(256 / 8);
            var symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
            var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.ASCII.GetBytes(VIKey));

            byte[] cipherTextBytes;

            using (var memoryStream = new MemoryStream())
            {
                using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                {
                    cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                    cryptoStream.FlushFinalBlock();
                    cipherTextBytes = memoryStream.ToArray();
                    cryptoStream.Close();
                }
                memoryStream.Close();
            }
            return Convert.ToBase64String(cipherTextBytes);
        }
    }

2

Re: Безпека для БД

Betterthanyou написав:

Є в цьому якийсь сенс ?

Так, звісно є. Пароль, телефонний номер і тд.

Betterthanyou написав:

Можна захистити БД від "зливу" ?

*SCRATCH*  Нууу тут питання що саме Ви маєте на увазі під слово "злив"...

Подякували: Betterthanyou1

3

Re: Безпека для БД

Betterthanyou написав:

Якщо я буду шифрувати всі дані за допомогою якогось криптографічного алгоритму, "ключі" від якого буду зберігати на сервері у виконавчий скрипт, це буде безпечно ? Є в цьому якийсь сенс ? Можна захистити БД від "зливу" ?

залежить від того, які чутливі дані ви хочете зберігати,
та яку найбільш ймовірну диру в безпеці ви так бажаєте пофіксати :)

якщо у зловмисника буде доступ до сервера, тобто і до бази, і до скрипта --
який сенс?
виходить, це не захист,  лише трішки "ускладнення задачі" атакеру,
у випадку ключів не в скрипті, а в бінарнику

якщо у зловмисника буде лише sql-ін'єкція --
можливо, таке тотальне шифрування і матиме сенс
хоча.. яка буде ефективність швидкодії субд,
та зручність користування субд, у такому випадку? :)

Подякували: Betterthanyou1

4

Re: Безпека для БД

fed_lviv написав:

*SCRATCH*  Нууу тут питання що саме Ви маєте на увазі під слово "злив"...

Під цим словом я маю на увазі будь які дії, які призведуть до того що хтось (зловмисник) отримає доступ до даних.

5

Re: Безпека для БД

221VOLT написав:
Betterthanyou написав:

Якщо я буду шифрувати всі дані за допомогою якогось криптографічного алгоритму, "ключі" від якого буду зберігати на сервері у виконавчий скрипт, це буде безпечно ? Є в цьому якийсь сенс ? Можна захистити БД від "зливу" ?

залежить від того, які чутливі дані ви хочете зберігати,
та яку найбільш ймовірну диру в безпеці ви так бажаєте пофіксати :)

якщо у зловмисника буде доступ до сервера, тобто і до бази, і до скрипта --
який сенс?
виходить, це не захист,  лише трішки "ускладнення задачі" атакеру,
у випадку ключів не в скрипті, а в бінарнику

якщо у зловмисника буде лише sql-ін'єкція --
можливо, таке тотальне шифрування і матиме сенс
хоча.. яка буде ефективність швидкодії субд,
та зручність користування субд, у такому випадку? :)

Я роблю демонстраційний проект для портфоліо. Потрібно використати сучасні методи криптографії та стандарти безпеки.
Дані - облікові записи клієнтів.
Добре, які є рішення ?

Подякували: leofun011

6

Re: Безпека для БД

Betterthanyou написав:

що хтось (зловмисник) отримає доступ до даних.

Ось якраз, щоб хтось своїми очима не розглядав певну інфу і бажано як мінімум шифрувати деякі дані.

Betterthanyou написав:

що хтось (зловмисник) отримає доступ до даних.

Це вже інша справа. Тут слід на іншому рівні обмежувати доступ до СУБД.

7

Re: Безпека для БД

fed_lviv написав:

Тут слід на іншому рівні обмежувати доступ до СУБД.

Наприклад як ?

8

Re: Безпека для БД

Перелік IP (або взагалі лише локальний доступ, хоча тут питання чи СУБД і додаток знаходяться на одному сервері) які можуть конектитися. Звісно максимально обмежувати права доступу до конкретних БД. Ну і креди, "трішки цікавіші", а не root 1111 :)

Подякували: Betterthanyou, leofun012

9

Re: Безпека для БД

Betterthanyou написав:

Я роблю демонстраційний проект для портфоліо. Потрібно використати сучасні методи криптографії та стандарти безпеки.
Дані - облікові записи клієнтів.
Добре, які є рішення ?

сучасні методи і рішення криптографії -- PGP (GnuPG), ECC (Elliptic-curve cryptography), ...

не знаю, які є рішення до завдання, якого немає (немає чітко визначеного)

Подякували: Betterthanyou1

10

Re: Безпека для БД

Для початку, так, треба визначитися із загрозами, правильно написали.
Якщо є загроза, що зловмисник отримає доступ до БД - мабуть, це може мати сенс; але сенс БД полягає саме в тому, щоб обробляти дані. Ви втрачаєте можливість шукати дані в БД і робити індекси, окрім як хеші за повним значенням. Це не так задумувалося.
З іншого боку, якщо зловмисник отримає доступ до БД, то зможе видалити всі ваші шифровки. А якщо отримає доступ до сервера - то і дані отримає.
Може, краще тоді шифрувати ключем, який надає користувач?

Подякували: Betterthanyou, leofun012

11

Re: Безпека для БД

koala, якщо мова йде про авторизацію, то ключ все одно повинен бути збережений на сервері для подальшої дешифрації, або ж на пристрої того, хто авторизується. Але пристрій може змінюватися, або ж дані з будь якого локального сховища можуть зникнути. Будь то повністю видалений додаток, або почищений кеш у браузері.
Інша справа коли end2end шифрування для анонімної переписки, тоді це більш виправдано.

Подякували: Betterthanyou, leofun01, 221VOLT3

12

Re: Безпека для БД

Можна використовувати як ключ для шифрування пароль (чи його хеш). Звісно, тоді виникає проблема відновлення загубленого пароля - але її теж можна розв'язати, нічого принципово неможливого тут немає.

13

Re: Безпека для БД

koala написав:

Звісно, тоді виникає проблема відновлення загубленого пароля - але її теж можна розв'язати, нічого принципово неможливого тут немає.

Наприклад користувач загубив пароль, якщо він підтвердить що це дійсно він (наприклад таємне слова яке буде зберігатися як хеш) як можна буде розшифрувати дані, старого пароля то вже немає ?

14 Востаннє редагувалося koala (31.03.2020 15:32:26)

Re: Безпека для БД

Додаємо ще один шар абстракції: ключ шифрування генерується при реєстрації. На сервері зберігається
(зашифрований паролем ключ, зашифрований ключем адміна ключ, зашифровані ключем дані)
Тепер головне - не тягати ключ адміна на цей сервер. Тобто доведеться тримати ще один сервер для шифрування ключів ключем адміна (не паролем, бо адмін може його теж загубити). За такої схеми навіть повний (root) доступ на основний сервер дає змогу лише видалити дані чи отримати ті, до яких зараз здійснюється доступ, усе інше - недоступне. А якщо хтось загубив пароль, то його ключ може розшифрувати адмін і перешифрувати новим паролем.

Подякували: Betterthanyou, Eff1c2

15 Востаннє редагувалося iovchynnikov (01.04.2020 08:56:47)

Re: Безпека для БД

Неможливо визначити вектор атаки не знаючи юз кейса. База не працює в ізоляції, правда? Неважливо як сильно зашифрована база, якщо до неї підключатиметься дирявий клієнт з валідним ключем. Хоч і тут можна дещо зробити.

- Захищайте перед усім сервер, на якому вона встановлена.
- Застосовуйте https://wiki.owasp.org/index.php/Category:Principle
- Клієнтам - лише ті права, які потрібно (least privilege, див. вище)
- Гешуйте все, що можна. Добрий геш краще за шифрування.
- Те що ви запропонували, це шифрування на рівні аплікаційї. Вади вже описали вище. Рекомендую не вигадувати свій алгоритм, скористуйтеся опціями, що давно існує в базах даних.

Знову ж таки, юз кейс не зрозумілий. Можливо пасуватиме Client-Side Encryption (If the system administrator for the server's machine cannot be trusted) (https://www.postgresql.org/docs/current … tions.html) з PostgreSQL чи просте шифрування диску.

Подякували: Eff1c, Betterthanyou, koala, leofun01, 221VOLT5