एक अनुवादक से: हालाँकि नीचे अनुवादित नजफ अली लेख का वादा थोड़ा विज्ञापन है ("हमारे लिए विशेषज्ञों की क्रिप्टोग्राफी छोड़ दें"), इसमें वर्णित उदाहरण काफी दिलचस्प और ध्यान देने योग्य थे।
इसके अतिरिक्त, एक सामान्य सत्य को दोहराना कभी भी अतिश्योक्तिपूर्ण नहीं होगा: अपने क्रिप्टो संरक्षण का आविष्कार न करें। और यह लेख पूरी तरह से दिखाता है कि क्यों।
योग्यता के चार चरण हैं:
- अचेतन अक्षमता - जब आप नहीं जानते कि आप अक्षम हैं और आपकी अक्षमता कितनी व्यापक है।
- सचेत अक्षमता - जब आप अपनी अक्षमता के बारे में जानते हैं और स्थिति को सुधारने के लिए आपको क्या कदम उठाने की आवश्यकता है।
- सचेत क्षमता - जब आप अच्छे होते हैं और आप इसके बारे में जानते हैं। (यह कमाल है!)
- अचेतन क्षमता - जब आप इतने अच्छे होते हैं कि आप इसके बारे में नहीं जानते हैं।
हम सभी पहले चरण से शुरू करते हैं, चाहे हम इसे पसंद करें या नहीं। किसी भी क्षेत्र में स्टेज 1 से स्टेज 2 तक जाने की कुंजी बहुत सी गलतियां करना और प्रतिक्रिया प्राप्त करना है। यदि आपको कोई प्रतिक्रिया मिलती है, तो आप समझने लगते हैं कि आपने सही काम किया, क्या गलत हुआ, और अगली बार आपको क्या सुधार करना चाहिए।
क्रिप्टोग्राफी खतरनाक है क्योंकि जब आप कुछ गलत करते हैं तो आपको प्रतिक्रिया नहीं मिलती है। औसत डेवलपर के लिए, बेस 64 में एन्कोडेड यादृच्छिक बाइट्स का एक ब्लॉक किसी भी अन्य के रूप में अच्छा है।
आप अनजाने में अच्छी तरह से प्रोग्राम करना सीख सकते हैं। यदि आपका कोड संकलित नहीं करता है, तो वह नहीं करता है जो आपको इसकी आवश्यकता है, या आसानी से पता लगाने योग्य कीड़े शामिल हैं, आपको तत्काल प्रतिक्रिया मिलती है। आप सब कुछ ठीक करते हैं, और अगली बार आप बेहतर होंगे।
क्रिप्टोग्राफी को अनायास नहीं सीखा जा सकता है। यदि आप कमजोरियों के बारे में पढ़ने की सामग्री और उन्हें इस्तेमाल करने की कोशिश में समय नहीं बिताते हैं, तो आपके घर में क्रिप्टोग्राफी-आधारित सुरक्षा तंत्र के पास वास्तविक हमलों के खिलाफ बहुत कम मौका है।
जब तक आप एक सुरक्षा विशेषज्ञ को भुगतान नहीं करते हैं जो जानता है कि क्रिप्टोग्राफी-आधारित सुरक्षा तंत्र को कैसे क्रैक किया जाता है, तो आप यह नहीं जान पाएंगे कि आपका कोड असुरक्षित है। आपके बचाव को दरकिनार करने वाले हमलावर या तो आपकी मदद नहीं करेंगे (आदर्श रूप से, वे इसे दरकिनार कर सकेंगे ताकि आपको इसके बारे में कभी पता न चले)।
नीचे क्रिप्टोग्राफी के दुरुपयोग के कुछ उदाहरण दिए गए हैं। इसके बारे में सोचें, यदि आपने इस पोस्ट को नहीं पढ़ा है, तो क्या
आप इन त्रुटियों को वास्तविकता में पा सकते हैं?
आपकी फोटो साझा करने की साइट के लिए प्रमाणीकरण एपीआई
संदेश प्रमाणीकरण MD5 + गुप्त का उपयोग करना
निम्नलिखित योजना का उपयोग करते हुए एक फोटो शेयरिंग साइट अपने एपीआई के लिए किसी भी तरह से प्रमाणित अनुरोध करती है:
- उपयोगकर्ता के पास निम्नलिखित विवरण हैं:
- सार्वजनिक उपयोगकर्ता आईडी जिसके साथ वे खुद को पहचानते हैं (सादे पाठ में इसे अग्रेषित करना सुरक्षित है)
- सर्वर द्वारा साझा किया गया वह रहस्य जिसके द्वारा वे संदेश पर हस्ताक्षर करते हैं (गुप्त रखा जाना चाहिए)
- API HTTP ( HTTPS — ). POST/GET (,
{ action: create, name: 'my-new-photo' }
). - , user id . — MD5 , -.
, , , .
:
require 'openssl'
user_id = '42'
secret = 'OKniSLvKZFkOhlo16RoTDg0D2v1QSBQvGll1hHflMeO77nWesPW+YiwUBy5a'
params = { foo: 'bar', bar: 'baz', user_id: user_id }
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
challenge_mac = params.delete(:mac)
message = params.each.map { |key, value| "#{key}:#{value}" }.join('&')
calculated_mac = OpenSSL::Digest::MD5.hexdigest(secret + message)
if challenge_mac == calculated_mac
else
end
, MD5, API. , ?
?, "
" (
Length extension attack).
:
md5('foo')
, MD5 md5('foobar')
, 'foo'.md5('secretfoo:bar')
, md5('secretfoo:bar&bar:baz')
, 'secret'.- , , . .
, ,
.
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
challenge_hmac = params.delete(:hmac)
message = params.each.map { |key, value| "#{key}:#{value}" }.join('&')
calculated_hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('md5'), secret, message)
if challenge_hmac == calculated_hmac
else
end
, ?
?,
(
Timing attack), HMAC .
:
- HMAC, . ASCII — 'aaaa...', 'bbbb...' ..
- . - , , , , HMAC.
- :
- , . , — 'x', HMAC 'xaaa...', 'xbbb...' ..
- , 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 — . . , .