17

मैं जो निम्नलिखित आवश्यकताओं को संतुष्ट फ़ाइल एन्क्रिप्शन/डिक्रिप्शन के लिए एक एल्गोरिथ्म के लिए खोज कर रहा हूँ के साथ/डिक्रिप्शन:रूबी: फ़ाइल एन्क्रिप्शन निजी/सार्वजनिक कुंजी

  • एल्गोरिथ्म विश्वसनीय
  • एल्गोरिथ्म बल्कि के लिए तेजी से होना चाहिए होना चाहिए बड़ी फ़ाइलों
  • निजी कुंजी कुछ पैरामीटर द्वारा उत्पन्न किया जा सकता (उदाहरण के लिए, पासवर्ड)
  • जनरेट किया गया निजी कुंजी सार्वजनिक कुंजी के साथ संगत होना चाहिए (सार्वजनिक कुंजी केवल एक बार उत्पन्न और डेटाबेस में संग्रहीत किया जाता है)

क्या सुझाए गए एल्गोरिदम का कोई रूबी कार्यान्वयन है?

उत्तर

26

खैर नोट: नक्काशी टिप्पणी में उल्लेख है के रूप में, इस सवाल का जवाब एक वास्तविक प्रणाली के लिए एक गरीब फिट है। सबसे पहले, इस विधि का उपयोग करके फ़ाइल एन्क्रिप्शन नहीं किया जाना चाहिए (उदाहरण के लिए lib एईएस प्रदान करता है।)। दूसरा, यह उत्तर किसी भी व्यापक मुद्दों को संबोधित नहीं करता है जो आपके समाधान को इंजीनियर करने के तरीके को भी प्रभावित करेगा।

मूल स्रोत भी more details में जाता है।

रूबी यह करने के लिए 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)) 

से here

+2

मैं वास्तव में कोई रूबीस्ट नहीं हूं, लेकिन वे बहुत अच्छी बैटरी हैं। मुझे आश्चर्य है कि पाइथन में बराबर कितना मुश्किल होगा ... – brice

+3

बस जोड़ना चाहते हैं कि उन फ़ाइलों को एन्सेप्ट किया जाना चाहिए, उदाहरण के लिए, एईएस -256, लेकिन इसकी कुंजी आरएसए के साथ भेज दी जानी चाहिए। – tiktak

+4

मुझे खेद है, लेकिन यह वास्तव में बुरा सलाह है। ओपी फ़ाइल एन्क्रिप्शन/डिक्रिप्शन के बारे में वार्ता करता है और इसके लिए आपको आरएसए का कभी भी उपयोग नहीं करना चाहिए। – emboss

10

मुझे डर है कि तुम यहाँ दो अवधारणाओं मिश्रण कर रहे हैं हूँ, प्रमाणीकरण/प्रमाणीकरण और गोपनीयता, एक ही चरण में दोनों पहलुओं को कवर करने की कोशिश कर रहा है, और यह काम नहीं करेगा। आपको असममित एल्गोरिदम के साथ "वास्तविक डेटा" को कभी भी एन्क्रिप्ट नहीं करना चाहिए। ए) वे इसके लिए बहुत धीमी हैं, बी) सूक्ष्म मुद्दे हैं कि, यदि सही नहीं किया जाता है, तो आपके समाधान की सुरक्षा को गंभीर रूप से कमजोर कर दिया जाएगा।

इसका एक अच्छा नियम है कि केवल एक चीज है कि आप निजी असममित कुंजी के साथ सममित एक बहुत तेजी से सममित एल्गोरिथ्म द्वारा इस्तेमाल किया कुंजी को एनक्रिप्ट है खत्म करना चाहिए। लेकिन लगभग सभी मामलों में आपको ऐसा भी नहीं करना चाहिए, क्योंकि उन मामलों में 90% मामलों में जो आप वास्तव में चाहते हैं वह टीएलएस (एसएसएल) है - मैंने कुछ समय पहले here क्यों समझाया था।

आपके मामले में, मुझे लगता है आवश्यकताएँ हैं:

  • डेटा है कि डेटाबेस में संग्रहीत करने के लिए की गोपनीयता: आम जनता यह (पढ़ने के लिए या यहां तक ​​कि इसे उपयोग करने में सक्षम नहीं होना चाहिए)

  • एक चयनित कुछ (शायद सिर्फ एक व्यक्ति) उपयोग करने में सक्षम है और पढ़ने होना चाहिए कि डेटा

पहला लक्ष्य आम तौर पर 012,318 का उपयोग करके हासिल की है। दूसरा लक्ष्य, यद्यपि संबंधित है, काफी अलग तरीकों से महसूस किया गया है। आप चाहते हैं कि उपयोगकर्ता प्रमाणीकृत होने के लिए फ़ाइल तक पहुंच रहा हो (यानी पहचान स्थापित करें) और उसके शीर्ष पर आप भी उन्हें अधिकृत होना चाहते हैं (यानी।जांच करें कि स्थापित पहचान का अधिकार है कि वे क्या करना चाहते हैं)। यह वह जगह है जहां असममित क्रिप्टोग्राफी चरण दर्ज कर सकती है, लेकिन जरूरी नहीं है। चूंकि आपका प्रश्न रेल के साथ टैग किया गया है, मुझे लगता है कि हम एक रेल आवेदन के बारे में बात कर रहे हैं। आपके पास आम तौर पर पहले से ही उपयोगकर्ताओं को प्रमाणीकृत और अधिकृत करने के कुछ साधन हैं (सबसे पहले उल्लिखित टीएलएस शामिल हैं), आप वास्तविक फ़ाइल एन्क्रिप्शन/डिक्रिप्शन के लिए एक सममित कुंजी स्थापित करने के लिए उन्हें पुनः उपयोग कर सकते हैं। Password-based encryption इस उद्देश्य के लिए उपयुक्त होगा, अगर आप असमान क्रिप्टो से बचना चाहते हैं। हालात और भी जटिल हो जाते हैं यदि आप पहले से ही गोपनीय डेटा की अखंडता सुनिश्चित करना चाहते हैं, यानी, आप प्रमाणित और अधिकृत उपयोगकर्ता को इस तरह की गारंटी देना चाहते हैं कि अंत में जो भी पहुंच है, उसे किसी भी तरह से बदला नहीं गया है इस बीच में।

इसके लिए एक समाधान विकसित करना कोई मामूली कार्य नहीं होगा और आपकी दी गई आवश्यकताओं पर बड़ी हद तक निर्भर करेगा, इसलिए मुझे डर है कि कोई भी "सुनहरा तरीका" नहीं है जो हर किसी के लिए उपयुक्त है। मैं कुछ शोध करने का सुझाव दूंगा, आप जो हासिल करने की कोशिश कर रहे हैं उसकी एक स्पष्ट तस्वीर प्राप्त करें और फिर उन विषयों पर अतिरिक्त सलाह प्राप्त करने का प्रयास करें जिन्हें आप अभी भी अनिश्चित/असहज महसूस करते हैं।

+1

उत्तर के लिए धन्यवाद!मैंने निम्नलिखित तरीके से डेटा को स्थानांतरित करने और संग्रहीत करने के साथ प्रश्न हल किया: 1) सममित एन्क्रिप्शन कुंजी (sym-key) उत्पन्न करें 2) sym-key के साथ फ़ाइलों को एन्क्रिप्ट करें 3) सार्वजनिक asym-key के साथ एन्क्रिप्ट sym-key 4) फ़ाइलें भेजें और एन्क्रिप्ट किया गया sym-key 5) उपयोगकर्ता के गुप्त टोकन के साथ उपयोगकर्ता निजी एन्क्रिप्टेड एसिम-कुंजी डिक्रिप्ट करें 6) निजी एसिम-कुंजी के साथ प्राप्त sym-key डिक्रिप्ट करें 7) डिक्रिप्ट किए गए sym-key के साथ फ़ाइलों को डिक्रिप्ट करें। लगता है कि यह सामान्य है। – tiktak

+2

यह सही दिशा है! लेकिन यह अभी भी हमलों को फिर से चलाने के लिए कमजोर है। एक असममित कुंजी द्वारा लिपटे एक कुंजी भेजने के बजाय, क्या आप इसके बजाय टीएलएस का उपयोग नहीं कर सके? मैंने पाया है कि लगभग सभी मामलों में जहां आप ए से बी तक डेटा लेते हैं, आपको एसिमेट्रिक क्रिप्टो के बजाय टीएलएस का उपयोग करना चाहिए - टीएलएस उन चीजों के खिलाफ आपकी सुरक्षा करता है जो अधिकतर कस्टम प्रोटोकॉल को तोड़ने की संभावना रखते हैं। – emboss

0

मैंने इस के साथ मदद करने के लिए एक मणि बनाया। इसे cryptosystem कहा जाता है। बस अपनी निजी कुंजी के साथ-साथ अपनी सार्वजनिक कुंजी के पथ और पथ को कॉन्फ़िगर करें, और यह बाकी है।

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

और decrypting:

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

आप इसे GitHub या RubyGems पर भी देख सकते हैं

एनक्रिप्टिंग के रूप में सरल है।

0

Symmetric Encryption निश्चित रूप से तेज़ है और बहुत बड़ी फ़ाइलों की स्ट्रीमिंग के लिए उत्कृष्ट समर्थन है।

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

सममित एन्क्रिप्शन एक संगठन के भीतर डेटा और बड़ी फ़ाइलों को एन्क्रिप्ट करने के लिए डिज़ाइन किया गया है।

जब अन्य संगठनों के साथ फ़ाइलों को साझा करने की बात आती है तो सबसे अच्छा विकल्प पीजीपी है। पीजीपी के साथ बहुत बड़ी फ़ाइलों की स्ट्रीमिंग के लिए विचार करें: फ़ाइल iostreams/lib/io_streams/अधिक पीजीपी उदाहरण के लिए pgp.rb पर IOStreams

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

देखो। यह सीधे रूबी से पीजीपी कुंजी प्रबंधन का भी समर्थन करता है।

संबंधित मुद्दे