Ваш подход хорош, с некоторыми корректировками на мой взгляд (обычно я кодирую для соответствия PCI):
Используйте CryptoAPI и Rijndael
Используйте как минимум Rijndael/AES256 независимо от других API.
Создайте IV и сохраните его с зашифрованными данными
Хорошо
Используйте DPAPI (область действия компьютера) для «защиты» симметричного ключа.
Не уверен, что это имеет значение. Я бы просто оставил IV рядом с зашифрованными данными или, если вы действительно параноик, на каком-то другом носителе. Убедитесь, что IV не доступен для общественности.
Храните симметричный ключ в реестре, файле или базе данных, разделяйте ключ и храните части в нескольких местах для дополнительной защиты.
Хранение в нескольких местах не поможет вам, если кто-то украдет ваш носитель. Это немного излишество, чтобы разбить ключ на части, но определенно НЕ храните его вместе с IV и/или зашифрованным текстом. Это было бы плохо.
не расшифровывайте данные, если они действительно не нужны, то есть не после чтения из базы данных. Вместо этого держите зашифрованный текст в памяти.
Определенно. Хранить зашифрованный текст в памяти в порядке, но никуда его не передавать, и не расшифровывать, кроме как в случае крайней необходимости, и даже тогда не ВЫСТАВЛЯТЬ весь незашифрованный набор данных - только то, что от него нужно по минимуму. Кроме того, по возможности не держите ключ в памяти — его может обнаружить дамп памяти.
Дополнения:
- В какой бы базе данных вы ни хранили свой зашифрованный текст, полностью ограничьте доступ для чтения теми процессами, которые выбираются для данного идентификатора. Не разрешайте доступ для чтения к таблицам, в которых хранятся эти данные, НИКОМУ, даже учетной записи SA. Таким образом, человеку, который взломает вашу систему, будет трудно получить ваши зашифрованные тексты, не зная, какие идентификаторы искать. Сделайте то же самое для любой таблицы (таблиц), ссылающихся на идентификатор в таблице зашифрованного текста. НЕ ДОПУСКАЕТСЯ ЧИТАТЬ ЭТИ ТАБЛИЦЫ!
- Ограничить доступ к базе данных по IP
- Никогда не сохраняйте незашифрованный открытый текст в памяти поверх состояния. Разрешить его разыменование/сборку мусора, как только запрос будет выполнен.
- Ограничьте серверы, на которых выполняется этот код, как можно меньшим числом пользователей.
- Возможно комбинирование методов шифрования для более надежного зашифрованного текста (например, AES + Blowfish)
Надеюсь, это поможет. Некоторые из них являются моим личным мнением, но, насколько мне известно, остаются совместимыми с PCI.
person
Haney
schedule
13.03.2014