Gorm - это библиотека ORM для Go. Это потрясающая библиотека, но в ней нет функций для шифрования данных в моделях (по крайней мере, я не нашел возможных решений). Итак, как насчет написания простого модуля Go для добавления возможностей шифрования?

Я написал простой модуль Go, который имеет одну главную цель: позволить писать и читать зашифрованные данные в / из базы данных с помощью Gorm.

Основной тип структуры в этом модуле - EncryptedValue:

Это простая структура, которую можно использовать как поле в gorm.Model. В нем есть поле Raw, в котором хранится, как вы понимаете, необработанное (незашифрованное) значение.

Пример

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

Итак, поехали. В нашей модели PizzaOrder есть поле Имя с типом строка и два поля с типами EncryptedValue: Телефон и Адрес. Он будет нормально работать с функцией gorm.DB.AutoMigrate, поэтому передайте ее, как обычно, с другими моделями.

Теперь мы должны инициализировать наш модуль парой ключей. Мы можем сгенерировать новую пару ключей или использовать существующую (например, загрузить закрытый ключ из файла PEM). Вы можете загружать закрытый и открытый ключи по своему усмотрению, есть два примера (сгенерированная пара ключей во время выполнения и пара ключей, загруженная из файла закрытого ключа):

Теперь мы можем использовать эту модель в нашем приложении для создания нового PizzaOrder:

Он создаст строку в таблице со столбцом name, равным незашифрованной строке «Pavel» и зашифрованным последовательностям байтов в phone и адрес столбцы.

Теперь мы можем получить доступ к этим PizzaOrder с помощью Gorm по их идентификаторам и получить доступ к необработанным значениям с помощью поля EncryptedValue.Raw:

Как видите, мы используем . (String) для преобразования нашего Raw типа поля interface {} в тип string . Я верю, что все пойдет по плану, и в августе 2021 года Golang 1.17 предоставит нам дженерики, так что я (мы) сможем с их помощью gorm-crypto проще использовать.

Финал

Итак, это некоторая информация о моем модуле gorm-crypto и пример его использования. Я считаю, что это поможет кому-то легче хранить конфиденциальные данные с помощью Gorm и Golang. Он доступен на GitHub: pkasila / gorm-crypto. Если вы хотите помочь проекту, вы можете открыть проблему с помощью отчета об ошибке или запроса функции, реализовать новые функции и исправить ошибки и отправить запросы на вытягивание. Также вы можете задать вопрос по этому поводу в Обсуждениях. Спасибо вам всем!