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

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

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

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


person tiktak    schedule 27.03.2012    source источник


Ответы (4)


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

из здесь

person brice    schedule 27.03.2012
comment
На самом деле я не рубист, но это довольно хорошие батареи. Интересно, насколько сложным будет эквивалент в python... - person brice; 27.03.2012
comment
Просто хочу добавить, что файлы должны быть зашифрованы, например, AES-256, но его ключ должен быть отправлен с помощью rsa. - person tiktak; 27.03.2012
comment
Извините, но это действительно плохой совет. ОП говорит о шифровании/дешифровании файлов, и вам никогда не следует использовать для этого RSA. - person emboss; 28.03.2012
comment
@emboss: см. предыдущий комментарий tiktak. Вы абсолютно правы. Желая ответить на вопрос, я не остановился на рассмотрении более широких проблем. Я постараюсь исправить свой пост, чтобы показать это. - person brice; 28.03.2012
comment
@brice: Отлично! Ничего страшного, просто не хотел, чтобы людей вводили в заблуждение :) - person emboss; 28.03.2012
comment
При чтении файла .cer я получил экземпляр открытого ключа OpenSSL::PKey::RSA, я не смог установить его как ключ aes, например cipher.key = KEY, где KEY — это экземпляр OpenSSL::PKey::RSA. Это правильный способ сделать это? stackoverflow.com/q/40760184/4477305 - person CodecPM; 26.11.2016

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

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

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

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

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

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

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

person emboss    schedule 28.03.2012
comment
Спасибо за ответ! Я решил вопрос с передачей и хранением данных следующим образом: 1) сгенерировать симметричный ключ шифрования (sym-key) 2) зашифровать файлы с помощью sym-key 3) зашифровать sym-key с открытым asym-key 4) отправить файлы и зашифровать sym-key 5) расшифровать личный зашифрованный асим-ключ пользователя с помощью секретного токена пользователя 6) расшифровать полученный sym-ключ с помощью закрытого асим-ключа 7) расшифровать файлы с помощью расшифрованного sym-ключа. Считай, что это вполне нормально. - person tiktak; 28.03.2012
comment
Это правильное направление! Но он по-прежнему уязвим для повторных атак. Вместо отправки ключа, обернутого асимметричным ключом, не могли бы вы вместо этого использовать TLS? Я обнаружил, что почти во всех случаях, когда вы передаете данные из точки А в точку Б, вы должны использовать TLS вместо асимметричного шифрования — TLS защищает вас от вещей, которые, скорее всего, нарушат пользовательский протокол. - person emboss; 29.03.2012

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.

person Reid    schedule 28.07.2017

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

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

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

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

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

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

person user6713635    schedule 15.05.2016