По умолчанию Ruby on Rails хранит данные сеанса в файлах cookie. Это имеет много преимуществ, таких как отсутствие необходимости в настройке любых уровней сохранения на стороне сервера. Однако данные сеанса не зашифрованы, а приложение Rails, которое я пишу, помещает потенциально конфиденциальные данные в сеанс. Я хотел бы избежать хранения серверных данных сеанса, если это возможно, и единственная существующая реализация зашифрованного хранилища файлов cookie для Rails, похоже, заброшена, поэтому я пишу свой собственный зашифрованный магазин cookie.Запись зашифрованного хранилища файлов cookie для Rails; мой подход безопасен?
рельсы печенья сессия магазин работает следующим образом:
- Он упорядочивает данные сеанса в строку байт.
- Сериализованные данные преобразуются в base64.
- Данные base64 добавляются HMAC. Rails требует, чтобы секретный ключ HMAC составлял не менее 30 байт; по умолчанию Rails генерирует 128-байтовую случайную строку в качестве секретного ключа, полученную из/dev/urandom. Алгоритмом хэширования по умолчанию, используемым для HMAC, является SHA-1.
- Данные base64 + HMAC отправляются клиенту HTTP в виде файла cookie.
- Когда клиент выполняет запрос, Rails сначала проверяет, прошла ли проверка HMAC. Если нет, то он будет молча отбрасывать данные сеанса в cookie, как если бы пользователь вообще не отправлял никаких данных сеанса. Это также означает, что если администратор изменяет секретный ключ HMAC, все старые сеансы автоматически становятся недействительными.
- Данные base64 де-base64'ed и unmarshalled в структуры данных Ruby.
Зашифрованное хранилище сеансов cookie, в котором я пишу подклассы обычного класса хранилища файлов cookie. Он работает следующим образом:
- Вставляет шаг 3.5: после шага 3 он будет шифровать данные.
- Он изменяет шаг 5: перед проверкой HMAC он расшифровывает данные.
- Алгоритм шифрования - AES-256 в режиме CFB. Я понимаю, что EBC будет подвергать повторяющиеся шаблоны.
- Код требует, чтобы администратор задал ключ шифрования ровно 32 байта. Ключ шифрования не хеширован. По умолчанию он предлагает произвольно сгенерированный ключ шифрования ровно 32 байта, полученный из/dev/urandom.
- Он также требует от администратора указать вектор инициализации ровно 16 байт. IV не хэшируется, и по умолчанию он предлагает случайное генерирование IV, полученное из/dev/urandom.
Причина, по которой я HMAC перед шифрованием (вместо HMAC после шифрования), заключается в том, что я хочу иметь возможность обнаруживать изменения ключа шифрования или IV. Я хочу, чтобы программное обеспечение автоматически аннулировало старые сессии, если был изменен ключ шифрования или IV. Если я HMAC после шифрования, то проверка HMAC будет проходить, если я изменю ключ шифрования или IV, что нежелательно.
Является ли мой подход безопасным? Если нет, то чего не хватает?
Несколько замечаний:
- Я хочу использовать CTR, как это было рекомендовано http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html, но, к сожалению, OpenSSL (который входит в стандартную библиотеку Ruby) не поддерживает CTR, и я не хочу потребовать от моих пользователей установки отдельных сторонних криптографических библиотек.
- Я хочу использовать SHA-256 для HMAC. daemonology.net рекомендует против SHA-512 из-за потенциальных «побочных атак на 32-битные системы» (что бы это ни значило). Однако SHA-256 как алгоритм хеширования для HMAC не поддерживается на каждой платформе. В частности, Ruby, поставляемый в OS X, не поддерживает HMAC + SHA256. Я хочу, чтобы мой код работал из коробки на OS X.
Насколько я знаю, IV предназначен для семян для процесса рандомизации данных CFB.И да, нынешний подход сохраняет секрет IV, потому что нет необходимости раскрывать его. Ключ шифрования и IV используются для шифрования каждого файла cookie. Это не должно быть проблемой, не так ли? – Hongli
@Hongli Я думаю, что oggy означает, что вы должны создать уникальный IV для каждого файла cookie и добавить его (незашифрованный) в этот файл cookie. – Inshallah
@Hongli Ваш IV не должен генерироваться/dev/urandom, потому что это может привести к тому, что один и тот же IV используется для двух файлов cookie. – Inshallah