Ruby: шифрование / дешифрование файлов с закрытыми / открытыми ключами - PullRequest
21 голосов
/ 27 марта 2012

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

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

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

Ответы [ 4 ]

32 голосов
/ 27 марта 2012

Примечание. Хорошо: . Как отмечено в комментариях, этот ответ плохо подходит для реальной системы.Во-первых, шифрование файлов не должно выполняться с использованием этого метода (например, 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))

из здесь

11 голосов
/ 28 марта 2012

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

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

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

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

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

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

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

0 голосов
/ 28 июля 2017

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

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: 'receiver@example.org') do |writer|
  writer.write('Hello World')
  writer.write('and some more')
end

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

0 голосов
/ 15 мая 2016

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

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

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

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

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

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

...