ठीक है, इसलिए मैंने इसे लिखा।
उपयोग:
hash: string;
hash := TBCrypt.HashPassword('mypassword01');
रिटर्न कुछ की तरह:
$2a$10$Ro0CUfOqk6cXEKf3dyaM7OhSCvnwM9s4wIX9JeLapehKK5YdLxKcm
इस (OpenBSD) शैली पासवर्ड हैश के बारे में उपयोगी बात है:
- कि यह एल्गोरिथ्म की पहचान करता है (
2a
= bcrypt)
- साल स्वचालित रूप से आप के लिए बनाया है, और हैश (
Ro0CUfOqk6cXEKf3dyaM7O
)
- लागत कारक पैरामीटर भी हैश (
10
) के साथ किया जाता है के साथ भेज दिया है।
एक पासवर्ड की जांच करने के सही है:
isValidPassword: Boolean;
isValidPassword := TBCrypt.CheckPassword('mypassword1', hash);
BCrypt एक लागत कारक है, जो निर्धारित करता है कि कितने पुनरावृत्तियों कुंजी सेटअप हालांकि जाना होगा उपयोग करता है। लागत जितनी अधिक होगी, हैश की गणना करना उतना महंगा होगा।
const
BCRYPT_COST = 10; //cost determintes the number of rounds. 10 = 2^10 rounds (1024)
इस मामले में 10
की लागत का मतलब है कुंजी विस्तार किया जाएगा और नमकीन 2 10
= 1,024 राउंड: निरंतर BCRYPT_COST
डिफ़ॉल्ट लागत में शामिल है। यह समय पर इस बिंदु पर आमतौर पर उपयोग किया जाने वाला लागत कारक है (शुरुआती 21 सेंट शताब्दी)।
यह भी दिलचस्प है कि, किसी ज्ञात कारण के लिए, ओपनबीएसडी हैश किए गए पासवर्ड को बेस -64 संस्करण में परिवर्तित कर दिया गया है जो कि ग्रह पर हर किसी के द्वारा उपयोग की जाने वाली बेस 64 से अलग है। तो TBCrypt
में कस्टम बेस -64 एन्कोडर और डिकोडर शामिल है।
यह भी ध्यान रखें कि हैश एल्गोरिथ्म संस्करण 2a
मतलब करने के लिए प्रयोग किया जाता है उपयोगी होता है:
- bcrypt
- पासवर्ड के अशक्त टर्मिनेटर शामिल टुकड़ों में बांटा डेटा में
- यूनिकोड तार UTF-8 एन्कोडेड
हैं
तो यही वजह है कि HashPassword
और CheckPassword
कार्यों एक WideString
(उर्फ 012,366 ले), और आंतरिक रूप से उन्हें यूटीएफ -8 में परिवर्तित करें। आप डेल्फी का एक संस्करण जहां UnicodeString
एक आरक्षित शब्द है पर इस चला रहे हैं, तो बस बाहर परिभाषित:
type
UnicodeString = WideString;
मैं, के रूप में डेविड हेफेरनान जानता है, डेल्फी XE 2. नहीं है जिसे मैं UnicodeString
उर्फ जोड़ा , लेकिन compilers.inc
शामिल नहीं किया और UnicodeString
को परिभाषित करें (क्योंकि मुझे नाम परिभाषित नहीं किया गया है, न ही मैं इसका परीक्षण कर सकता हूं)। आप मुफ्त कोड से क्या चाहते हैं?
कोड दो इकाइयों के शामिल हैं:
- Bcrypt.pas (जो मैं ने लिखा है, एम्बेडेड DUnit परीक्षण के साथ)
- Blowfish.pas (जो डेव बार्टन ने लिखा है, जो मैं अनुकूलित, बढ़ाया, कुछ कीड़े तय की और DUnit जोड़ा परीक्षण)।
इंटरबेट्स पर जहां मैं कुछ कोड डाल सकता हूं जहां यह शाश्वतता में रह सकता है?
अद्यतन 1/1/2015: इसे कुछ समय पहले गिटहब पर रखा गया था: BCrypt for Delphi।
बोनस 2015/04/16: वहाँ अब Scrypt for Delphi
पर उपलब्ध है क्या आप Vista में पेश किए गए विंडोज बीक्रिप्ट पर विचार करने के लिए तैयार हैं? जेडीआई के पास हेडर अनुवाद है: JwaBCrypt.pas –
@ डेविड: यह प्रश्न में उल्लिखित 'bcrypt.h' winapi शीर्षलेख का एक और अनुवाद प्रतीत होता है, जो वास्तव में ब्लॉफिश पासवर्ड-हैशिंग कार्यान्वयन नहीं करता है । (या क्या मुझे कुछ याद आ रही है?) –
रुडी का हेडर जेडीआई की उत्पत्ति है, http://blog.delphi-jedi.net/2008/03/10/new-and-additional-header-files-from-rudy/ –