Я создаю приложение, которое требует соответствия HIPAA, которое, чтобы прервать преследование, означает, что я не могу позволить определенным соединениям свободно просматривать в базе данных (пациенты и рекомендации для них).Rails 4 зашифровать внешний ключ
Эти таблицы подключены через таблицу patients_recommendations
в моем приложении, которая хорошо работала, пока я не добавил шифрование через attr_encrypted. Чтобы сократить количество шифрования и дешифрования (и связанных с ними служебных данных), я хотел бы просто шифровать patient_id
в таблице patients_recommendations
. Однако при изменении типа данных в string
и имя столбца encrypted_patient_id
, приложение брейки со следующей ошибкой при попытке повторно заполнить мою базу данных:
не может написать неизвестный атрибут `patient_id»
Я предполагаю, что это связано с тем, что соединение ищет столбец напрямую, а не через модель (имеет смысл, использование модели, вероятно, медленнее). Есть ли способ, которым я могу заставить Rails пройти через модель (где attr_encrypted
добавил необходимые вспомогательные методы)?
Update:
В попытке найти работу вокруг, я пытался добавить before_save к модели, как так:
before_save :encrypt_patient_id
...
private
def encrypt_patient_id
self.encrypted_patient_id = PatientRecommendation.encrypt(:patient_id, self.patient_id)
self.patient_id = nil
end
Это не работает либо, однако , что приводит к той же ошибке unknown attribute
. Любое решение могло бы работать для меня (хотя первое касалось основной проблемы), любые идеи, почему before_save
не вызывается при создании через ассоциацию?
Будет ли односторонний хэш работать для вас вместо двухстороннего шифрования? Вы можете использовать 'SHA512 (secret_key + patient_id)' как внешний ключ, и все относительно просто. Большие символы делают дорогие индексы, хотя – bbozo
Двусторонние шифровки обычно не выдерживают криптографического контроля, если у них фиксированный IV, и на первый взгляд кажется, что только фиксированное шифрование IV подходит для использования в качестве внешнего ключа, хеши работают, хотя .. Можете ли вы связать части спецификации HIPAA, которые задают это для вас? – bbozo
В соответствии с HIPAA вам необходимо обеспечить персональную информацию о здоровье (PHI) и личную идентификационную информацию (PII) в пути и в состоянии покоя. Поскольку мое приложение позволит повторное использование и редактирование Рекомендаций, шифрование всех данных в этих полях (так что вы не можете сказать все рекомендации, сделанные для человека), похоже, больше накладных расходов, чем просто шифрование/дешифрование идентификаторов соединительной таблицы , Идея заключается в том, что Rails расшифровывает ключ, а затем объединяет, поэтому индексирование на этом ключе не требуется. –