2012-05-23 3 views
4

Как хранить «чувствительные» данные в базе данных MySQL?Хранить «чувствительные» данные в MySQL DB

1) Должен ли я больше сосредоточиться на безопасности базы данных MySQL и хранить данные в виде обычного текста?

2) Должен ли я шифровать данные?

  • Если да, то как это сделать шифрование?
    1. Использование MySQL aes_encrypt/aes_decrypt?
    2. Использование функций/алгоритмов PHP AES для шифрования/дешифрования данных?
  • Как хранить данные в MySQL?
    1. BLOB
    2. BINARY
    3. VARBINARY

В моем случае 'чувствительные' данные являются платежи, сделанные отдельными лицами.

Благодаря

+3

Это очень зависит от вашего приложения. – eggyal

+1

да, это зависит от того, какие данные вам нужно хранить, – jugnu

ответ

3

Это смесь обоих. Два существующих ответа (в то время я написал https://stackoverflow.com/a/10718397/1015483 и https://stackoverflow.com/a/10718459/1015483) справедливы - вы должны смотреть на около 5 способов возможного нападения, что я могу думать

  • Они получают доступ к БД сервера; так что да, обеспечьте, чтобы ребенок был настолько же разумным (ответ Мэтта)
  • Автономный захват данных (кто-то добирается до ваших данных базы данных как-то иначе, может быть резервной, может быть, они угадывают пароль, может быть MITM, если вы переводите данные из одного места в другое). Для этого вы делаете encypt свои данные. По какой-то причине вы также можете сделать свалку CSV и отправить кому-то электронное письмо. Упс. Но это происходит.Так зашифровать (ответ vlzvt в)

Но три элемента не упомянутые:

  • Они могли бы получить доступ к веб-серверу (если он отличается от БД сервера). Если у них есть доступ к веб-серверу, все ставки отключены, так как у них есть свой пароль, ключ-ключ к успеху. Поэтому вам нужно сделать это еще более безопасным, чем сервер БД. (Мэтт, возможно, имел в виду, что выше, но просто дайте понять)
  • Как и выше, но не следует забывать, является ли кто-то доступ к phpMyAdmin или вашему консулу управления. Не используйте для доступа доступ к открытым паролям с открытым текстом или конфигом.
  • Наконец-то есть ваше приложение (и самое сложное для блокировки). Вам нужно предотвратить использование инъекций SQL, которые могут выявить данные. Шифрование данных остановило бы минимизацию проблем, если бы кто-то действительно получал доступ через незапрашиваемый запрос - поэтому для этого шифрование является решением.

Для части 2 Ваш вопрос:

Использование MySQL шифрования/дешифрования функции остановит кого-то, кто имеет доступ к необработанным данным, но не MITM или SQL инъекции или даже CSV дампы приняты для транспорта ,

Итак, IMO (и это только мое мнение и то, как я это сделал) - это зашифровать с помощью PHP и зашифровать зашифрованные данные по проводу, поскольку это останавливает все методы захвата данных и свалку CSV будет «скремблироваться».

Если вы это сделаете, вы также можете использовать типы varbinary/blob, так как это не позволяет вам случайно читать/редактировать в phpMyAdmin. Плюс потенциально экономит несколько байт номинально (хотя это зависит от индексов и других вещей, так что один не является выигрышным аргументом).


И теперь нижняя сторона: поиск и сортировка. Все, что вы индексируете или выполняете поиск, если оно зашифровано, будет соответствовать только всей, точной, чувствительной к регистру строке, заполненной до нужной длины (обычно поиск будет нечувствительным к регистру, и вы можете выполнять поиск деталей с помощью LIKE). И если вы хотите ORDER BY, вам нужны исходные строки. Так что не стоит иметь в виду при проектировании структуры.

Надеюсь, что это поможет.

+0

Процесс обеспечения безопасности системы - это как протокол AAA, многоуровневая задача, где на каждом уровне проблемы различаются между собой. Хороший ответ –

+1

@Robbie Мы должны задать вопрос о типе столбца для зашифрованных данных: 1.BLOB, 2.BINARY, 3.VARBINARY Помогает другим искать похожие сведения или мнения. Для ответа я бы пошел с этим S.O. вопрос/ответ (BLOB): http://stackoverflow.com/questions/15980025/use-blob-or-varbinary-for-encrypted-data-in-mysql – Ligemer

3

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

+0

ключ шифрования предназначен для безопасности и может быть безопасно скрыт в zend-ed php-файле с нулевой возможностью быть разбитым. –

1

, если вам нужно для защиты данных в вашей, возможно, взломали базу данных, вы можете зашифровать его с mcrypt

$key = "mykey"; 
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$data,MCRYPT_MODE_ECB,$key); 

после этого вы можете выбрать BLOB, TEXT, MEDIUMTEXT или что-либо, основываясь на ~ ожидаемых данных размер. * для VARBINARY/BINARY вам может понадобиться pack это первый.

1

Операция шифрования имеет дополнительную стоимость.

Необходимо оценить, будет ли в вашей ситуации эта дополнительная стоимость проблемой, например, если ваши данные будут иметь значительный размер.

Первой границей, чтобы избежать утечки данных, является сильная политика доступа к данным с профилями доступа и так далее. Это имеет тот недостаток, что вам нужно будет управлять mysql и конфигурировать его.

Если вы хотите заботиться об управлении профилями, вы можете зашифровать данные, предполагая дополнительную стоимость в CPU и (зависящий от алгоритма encyption) дополнительное пространство для хранения.

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

Смежные вопросы