सी ++ क्रिप्टो: भाग 3-pbkdf2
आधुनिक क्रिप्टो पुस्तकालयों के लिए चारों ओर देख रहे हैं।
कुछ भी अच्छा नहीं मिल रहा था।
मुझे पता है कि मैंने शायद यह सब गलत किया है इसलिए यहां मेरे साथ काम करें। चार संरचनाओं के लिए चार अलग-अलग समीक्षाएं होंगी जो एक दूसरे पर बनती हैं:
- हैशिंग
- हसडे की
- पासवर्ड की
- नमकीन चैलेंज प्रतिक्रिया
यह समीक्षा pbkdf2 के कार्यान्वयन के कार्यान्वयन के लिए है। यह एचएमएसी का उपयोग करने का एक तरीका है जो आपको विफलताओं पर हैश बनाने के लिए आकस्मिक रूप से अधिक महंगा बनाने की अनुमति देता है। विचार यह है कि आप बहुत सारे अनुमान लगाने के लिए कठिन बनाकर हमलों को धीमा कर सकते हैं।
डाटा संरचनाओं और कार्यान्वयन इन सवालों में प्रस्तुत पर आधारित होते हैं RFC2104 और पर इस पोस्ट codeproject ।
उपयोग उदाहरण
Digest<Pbkdf2<HMac<Sha1>>> digest;
Pbkdf2<HMac<Sha1>> pbkdf2;
pbkdf2.hash("The password", "A Salt", 2048, digest);
pbkdf2.h
#ifndef THORS_ANVIL_CRYPTO_PBKDF2_H
#define THORS_ANVIL_CRYPTO_PBKDF2_H
#include "hmac.h"
#include <string>
// RFC-2898 PKCS #5: Password-Based Cryptography Specification Version 2.0
namespace ThorsAnvil::Crypto
{
// Look in hmac.h for good examples of PRF
// ThorsAnvil::Crypto::HMac
template<typename PRF>
struct Pbkdf2
{
static constexpr std::size_t digestSize = PRF::digestSize;
using DigestStore = typename PRF::DigestStore;
void hash(std::string const& password, std::string const& salt, long iter, DigestStore& digest)
{
#pragma vera-pushoff
using namespace std::string_literals;
#pragma vera-pop
PRF prf;
DigestStore tmp;
prf.hash(password, salt + "\x00\x00\x00\x01"s, tmp);
std::copy(std::begin(tmp), std::end(tmp), std::begin(digest));
for (int loop = 1; loop < iter; ++loop)
{
prf.hash(password, tmp.view(), tmp);
for (std::size_t loop = 0; loop < digestSize; ++loop)
{
digest[loop] = digest[loop] ^ tmp[loop];
}
}
}
};
}
#endif
जवाब
void hash(std::string const& password, std::string const& salt, long iter, DigestStore& digest)
...
for (int loop = 1; loop < iter; ++loop)
...
for (std::size_t loop = 0; loop < digestSize; ++loop)
"एक longएक intऔर एक std::size_tसब एक बार ... में चला गया" वे सब नहीं हो सकता std::size_t?
इसके अलावा, loopचर को ओवरराइड करना अनावश्यक रूप से भ्रमित करना है।
std::copy(std::begin(tmp), std::end(tmp), std::begin(digest));
मुझे लगता है कि यह सिर्फ digest = tmp;एक उपयुक्त असाइनमेंट ऑपरेटर के साथ हो सकता है ।
salt + "\x00\x00\x00\x01"s
क्या यह एक नामित स्थिरांक (या एक नामित फ़ंक्शन) भी हो सकता है? या शायद यह बताने के लिए एक टिप्पणी जोड़ें कि यह यहाँ क्यों है।
digest[loop] = digest[loop] ^ tmp[loop];
नाइटपिक: उपयोग कर सकते हैं ^=
शायद आउटपुट का रिटर्न वैल्यू होना चाहिए, संदर्भ के लिए नहीं?
मैं इस के एल्गोरिथ्म / सुरक्षा पहलुओं का आकलन करने के लिए क्रिप्टोग्राफी / सुरक्षा के बारे में पर्याप्त नहीं जानता।