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



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




  • алгоритм должен быть надежным

  • алгоритм должен быть быстрым для достаточно больших файлов

  • закрытый ключ может быть сгенерирован с помощью некоторого параметра (например, пароля)

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


Существует ли какая-либо Рубиновая реализация предложенного алгоритмы?

865   4  

4 ответов:

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

Из сюда

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

Comments

    Ничего не найдено.