Подтвердить что ты не робот

Как защитить пользовательские данные в базе данных с помощью Rails?

Я создаю приложение rails, которое должно хранить большое количество конфиденциальных данных. Чтобы гарантировать клиентам, что данные защищены, я хочу зашифровать их для каждого пользователя. Я проделал исследование, ищущее драгоценные камни, которые могут это сделать. До сих пор я нашел strongbox и safe. Вместе это, казалось бы, обеспечило бы решение для меня.

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

4b9b3361

Ответ 1

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

Всегда предполагайте, что если хакер может скомпрометировать любую часть вашей безопасности, они могут скомпрометировать все это. Цепь только сильна, как ее самое слабое звено и все такое.

Номера кредитных карт и номера социального страхования (которые, к счастью, вам обычно не нужно индексировать), вероятно, являются наиболее очевидным исключением из этого, но если вы должны задать этот вопрос, у вас нет бизнеса, хранящего эти предметы в первую очередь. Там есть всевозможные юридические проблемы, с которыми вы можете столкнуться, чтобы испортить этот материал.

Ответ 2

Номер кредитной карты, SSN и т.д. всегда должны храниться в зашифрованном виде.

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

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

class User
  # has db column encrypted_cc_number
  def unencrypted_cc_number
    WhateverEncryptionClassYouUse.decrypt(encrypted_cc_number)
  end
  def unencrypted_cc_number=(val)
    self.encrypted_cc_number = WhateverEncryptionClassYouUse.encrypt(val)
  end
end

Ответ 3

Использование многоуровневых механизмов безопасности и сильной криптографии - хорошая практика, если вы храните большое количество конфиденциальных данных. Это требуется стандартом безопасности данных платежных карт (PCI DSS). Я предлагаю вам прочитать следующий документ руководства: https://www.pcisecuritystandards.org/pdfs/pci_fs_data_storage.pdf.

Вы определенно не должны "предполагать, что он никогда не будет скомпрометирован"