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

Ruby: шифрование/дешифрование файлов с закрытыми/открытыми ключами

Я ищу алгоритм шифрования/дешифрования файлов, который удовлетворяет следующим требованиям:

  • Алгоритм должен быть надежным
  • Алгоритм должен быть быстрым для довольно больших файлов
  • Закрытый ключ может быть сгенерирован с помощью некоторого параметра (например, пароля)
  • Сгенерированный закрытый ключ должен быть совместим с открытым ключом (открытый ключ генерируется только один раз и сохраняется в базе данных)

Есть ли реализация Ruby предлагаемых алгоритмов Ruby?

4b9b3361

Ответ 1

Замечание Хорошо: Как говорится в комментариях к комментариям, этот ответ плохо подходит для реальной системы. Во-первых, шифрование файлов не должно выполняться с помощью этого метода (например, lib предоставляет AES). Во-вторых, этот ответ не затрагивает ни одну из более широких проблем, которые также повлияют на то, как вы разрабатываете свое решение.

Оригинальный источник также переходит в подробнее.

Ruby может использовать openssl для этого:

#!/usr/bin/env ruby

# ENCRYPT

require 'openssl'
require 'base64'

public_key_file = 'public.pem';
string = 'Hello World!';

public_key = OpenSSL::PKey::RSA.new(File.read(public_key_file))
encrypted_string = Base64.encode64(public_key.public_encrypt(string))

И расшифруйте:

#!/usr/bin/env ruby

# DECRYPT

require 'openssl'
require 'base64'

private_key_file = 'private.pem';
password = 'boost facile'

encrypted_string = %Q{
...
}

private_key = OpenSSL::PKey::RSA.new(File.read(private_key_file),password)
string = private_key.private_decrypt(Base64.decode64(encrypted_string))

из здесь

Ответ 2

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

Хорошее эмпирическое правило состоит в том, что единственное, что вы должны в конечном итоге шифровать с помощью частных асимметричных ключей, - это симметричные ключи, используемые гораздо более быстрым симметричным алгоритмом. Но почти во всех случаях вы даже не должны этого делать, потому что в 90% случаев то, что вы действительно хотите, это TLS (SSL) в этих случаях - я пытался объяснить, почему здесь некоторое время назад.

В вашем случае я предполагаю, что следующие требования:

  • конфиденциальность данных, которые должны быть сохранены в базе данных: широкая публика не должна быть в состоянии прочитать (или даже получить доступ к ней)

  • выбранные немногие (возможно, только один человек) должны иметь доступ и читать эти данные

Первая цель обычно достигается с помощью симметричного шифрования. Вторая цель, хотя и связана, реализуется совершенно другими средствами. Вы хотите, чтобы пользователь, получивший доступ к файлу, был аутентифицирован (т.е. Установил личность), и, кроме того, вы также хотите, чтобы они были авторизованы (то есть проверьте, имеет ли установленная идентификация право делать то, что они намереваются). Здесь асимметричная криптография может выйти на сцену, но не обязательно. Поскольку ваш вопрос отмечен Rails, я предполагаю, что мы говорим о приложении Rails. Как правило, у вас уже есть некоторые способы аутентификации и авторизации пользователей (скорее всего, с использованием вышеупомянутого TLS), вы можете просто повторно использовать их, чтобы установить симметричный ключ для фактического шифрования/дешифрования файлов. шифрование на основе паролей подходит для этой цели, если вы хотите вообще избегать асимметричного криптования. Все становится еще сложнее, если вы также хотите обеспечить целостность уже конфиденциальных данных, то есть вы хотите дать своего рода гарантию аутентифицированному и авторизованному пользователю в том смысле, что то, что они, наконец, не изменили каким-либо образом в это время.

Разработка решения для этого не будет тривиальной задачей и в значительной степени зависит от ваших требований, поэтому я боюсь, что нет "золотого пути", который подходит всем. Я бы предложил провести какое-то исследование, получить более четкое представление о том, чего вы пытаетесь достичь и как, а затем попытаться получить дополнительные советы по тем предметам, которые вы все еще чувствуете неуверенно/неудобно.

Ответ 3

Я сделал драгоценный камень, чтобы помочь с этим. Он назывался cryptosystem. Просто настройте путь и пароль для вашего закрытого ключа, а также путь к вашему открытому ключу, и он сделает все остальное.

Шифрование выполняется так же просто, как:

rsa = Cryptosystem::RSA.new
rsa.encrypt('secret') # => "JxpuhTpEqRtMLmaSfaq/X6XONkBnMe..."

И расшифровка:

encrypted_value = rsa.encrypt('secret') # => "Y8DWJc2/+7TIxdLEolV99XI2sclHuK..."
rsa.decrypt(encrypted_value) # => "secret"

Вы можете проверить это на GitHub или RubyGems.

Ответ 4

Symmetric Encryption определенно быстр и имеет отличную поддержку для потоковой передачи очень больших файлов.

SymmetricEncryption::Writer.open('my_file.enc') do |file|
  file.write "Hello World\n"
  file.write "Keep this secret"
end

Симметричное шифрование предназначено для шифрования данных и больших файлов внутри организации.

Когда дело доходит до обмена файлами с другими организациями, лучшим вариантом является PGP. Для потоковой передачи очень больших файлов с PGP рассмотрите: IOStreams

IOStreams.writer('hello.pgp', recipient: '[email protected]') do |writer|
  writer.write('Hello World')
  writer.write('and some more')
end

Посмотрите на файл iostreams/lib/io_streams/pgp.rb для получения дополнительных примеров PGP. Он также поддерживает управление ключами PGP непосредственно из Ruby.