आप क्रिप्टोग्राफी में खतरनाक रूप से अक्षम हैं

एक अनुवादक से: हालाँकि नीचे अनुवादित नजफ अली लेख का वादा थोड़ा विज्ञापन है ("हमारे लिए विशेषज्ञों की क्रिप्टोग्राफी छोड़ दें"), इसमें वर्णित उदाहरण काफी दिलचस्प और ध्यान देने योग्य थे।
इसके अतिरिक्त, एक सामान्य सत्य को दोहराना कभी भी अतिश्योक्तिपूर्ण नहीं होगा: अपने क्रिप्टो संरक्षण का आविष्कार न करें। और यह लेख पूरी तरह से दिखाता है कि क्यों।


योग्यता के चार चरण हैं:
  1. अचेतन अक्षमता - जब आप नहीं जानते कि आप अक्षम हैं और आपकी अक्षमता कितनी व्यापक है।
  2. सचेत अक्षमता - जब आप अपनी अक्षमता के बारे में जानते हैं और स्थिति को सुधारने के लिए आपको क्या कदम उठाने की आवश्यकता है।
  3. सचेत क्षमता - जब आप अच्छे होते हैं और आप इसके बारे में जानते हैं। (यह कमाल है!)
  4. अचेतन क्षमता - जब आप इतने अच्छे होते हैं कि आप इसके बारे में नहीं जानते हैं।


हम सभी पहले चरण से शुरू करते हैं, चाहे हम इसे पसंद करें या नहीं। किसी भी क्षेत्र में स्टेज 1 से स्टेज 2 तक जाने की कुंजी बहुत सी गलतियां करना और प्रतिक्रिया प्राप्त करना है। यदि आपको कोई प्रतिक्रिया मिलती है, तो आप समझने लगते हैं कि आपने सही काम किया, क्या गलत हुआ, और अगली बार आपको क्या सुधार करना चाहिए।

क्रिप्टोग्राफी खतरनाक है क्योंकि जब आप कुछ गलत करते हैं तो आपको प्रतिक्रिया नहीं मिलती है। औसत डेवलपर के लिए, बेस 64 में एन्कोडेड यादृच्छिक बाइट्स का एक ब्लॉक किसी भी अन्य के रूप में अच्छा है।

आप अनजाने में अच्छी तरह से प्रोग्राम करना सीख सकते हैं। यदि आपका कोड संकलित नहीं करता है, तो वह नहीं करता है जो आपको इसकी आवश्यकता है, या आसानी से पता लगाने योग्य कीड़े शामिल हैं, आपको तत्काल प्रतिक्रिया मिलती है। आप सब कुछ ठीक करते हैं, और अगली बार आप बेहतर होंगे।

क्रिप्टोग्राफी को अनायास नहीं सीखा जा सकता है। यदि आप कमजोरियों के बारे में पढ़ने की सामग्री और उन्हें इस्तेमाल करने की कोशिश में समय नहीं बिताते हैं, तो आपके घर में क्रिप्टोग्राफी-आधारित सुरक्षा तंत्र के पास वास्तविक हमलों के खिलाफ बहुत कम मौका है।

जब तक आप एक सुरक्षा विशेषज्ञ को भुगतान नहीं करते हैं जो जानता है कि क्रिप्टोग्राफी-आधारित सुरक्षा तंत्र को कैसे क्रैक किया जाता है, तो आप यह नहीं जान पाएंगे कि आपका कोड असुरक्षित है। आपके बचाव को दरकिनार करने वाले हमलावर या तो आपकी मदद नहीं करेंगे (आदर्श रूप से, वे इसे दरकिनार कर सकेंगे ताकि आपको इसके बारे में कभी पता न चले)।

नीचे क्रिप्टोग्राफी के दुरुपयोग के कुछ उदाहरण दिए गए हैं। इसके बारे में सोचें, यदि आपने इस पोस्ट को नहीं पढ़ा है, तो क्या आप इन त्रुटियों को वास्तविकता में पा सकते हैं?

आपकी फोटो साझा करने की साइट के लिए प्रमाणीकरण एपीआई



संदेश प्रमाणीकरण MD5 + गुप्त का उपयोग करना


निम्नलिखित योजना का उपयोग करते हुए एक फोटो शेयरिंग साइट अपने एपीआई के लिए किसी भी तरह से प्रमाणित अनुरोध करती है:


, , , .
:

#  

require 'openssl'

##  
user_id = '42'
secret  = 'OKniSLvKZFkOhlo16RoTDg0D2v1QSBQvGll1hHflMeO77nWesPW+YiwUBy5a'

##  ,    
params = { foo: 'bar', bar: 'baz', user_id: user_id }

##  MAC
message      = params.each.map { |key, value| "#{key}:#{value}" }.join('&')
params[:mac] = OpenSSL::Digest::MD5.hexdigest(secret + message)

##     - ...
HTTP.post 'api.example.com/v3', params

#  

##     
user   = User.find(params[:user_id])
secret = user.secret

##  MAC   
challenge_mac = params.delete(:mac)

##  MAC ,    ,   
message        = params.each.map { |key, value| "#{key}:#{value}" }.join('&')
calculated_mac = OpenSSL::Digest::MD5.hexdigest(secret + message)

##   MAC     
if challenge_mac == calculated_mac
  #    - ,   
else
  #   , 
end


, MD5, API. , ? ?

, " " (Length extension attack).

:


, , . Flickr, Vimeo Remember the Milk (pdf).

, . , . .

? , , …

HMAC


Hash-based Message Authentication Code (HMAC) .

! HMAC . , --.

:

require 'openssl'

##     
user   = User.find(params[:user_id])
secret = user.secret

##  HMAC   
challenge_hmac = params.delete(:hmac)

##  HMAC
##       ,   
message         = params.each.map { |key, value| "#{key}:#{value}" }.join('&')
calculated_hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('md5'), secret, message)

##   HMAC     
if challenge_hmac == calculated_hmac
  #    - ,   
else
  #   , 
end


, ? ?

, (Timing attack), HMAC .

:


, HMAC , API, .

-, , , . , . , . .



HMAC


, HMAC . .. , , .

, XOR 0. , — XOR A B, true, 0, false .
Ruby - :

require 'openssl'

##   ,   
def secure_equals?(a, b)
  return false if a.length != b.length
  a.bytes.zip(b.bytes).inject(0) { |sum, (a, b)| sum |= a ^ b } == 0
end


##     
user   = User.find(params[:user_id])
secret = user.secret

##  HMAC   
challenge_hmac = params.delete(:hmac)

##  HMAC
##       ,   
message         = params.each.map { |key, value| "#{key}:#{value}" }.join('&')
calculated_hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('md5'), secret, message)

##   HMAC     
if secure_equals?(challenge_hmac, calculated_hmac)
  #    - ,   
else
  #   , 
end


, ? ?

. . , .

. . . .

P.S. HMAC activesupport, ActiveSupport::MessageVerifier. . .

P.P.S. ? Matasano Crypto Challenges — , . , , .

: Najaf Ali — . . , .

Source: https://habr.com/ru/post/In181372/


All Articles