delphi डेल्फी में एचएमएसी-एसएचए 256




amazon-web-services hmac (5)

मुझे अमेज़ॅन वेब सेवाओं एपीआई के लिए एचएमएसी-एसएचए 256 के हस्ताक्षर बनाने की जरूरत है I पुरानी डीसीपीक्रिप्ट लाइब्रेरी में शा 256 रूटीन है लेकिन एचएमएसी हस्ताक्षर नहीं करता है। किसी को भी एक मुफ्त हैशिंग पुस्तकालय का उपयोग कर सकते हैं मैं जानता हूँ?


एचएमएसी सिर्फ एक फ़ंक्शन है जो कुछ परिभाषित नियमों के अनुसार हैश की गणना करने के लिए SHA256 का उपयोग करता है। यदि आप विकिपीडिया देख रहे हैं तो इसमें एक छद्मकोण उदाहरण है

आप सिस्टम में .NET के एचएमएसी कक्षा में भी कॉल कर सकते हैं। सुरक्षा। COM इंटरप्रोफ़ द्वारा क्रिप्टोग्राफ़ी।


मेरा पसंदीदा जवाब - मैं ओपनएसएसएल पुस्तकालयों, एचएमएसी फ़ंक्शन का उपयोग करेगा। मैंने सफलतापूर्वक एम फेरांट http://www.disi.unige.it/person/FerranteM/delphiopenssl/ से काम को अपनाने और अनुकूल बनाने के द्वारा डेल्फी में OpenSSL पुस्तकालयों का उपयोग किया है
अन्य ओपनएसएसएल हस्ताक्षर आदि के लिए यह लिंक देखें
डी 2010 में ऐसा कुछ है (लिबई 32 वेब साइट से लिया गया यूनिट और यूनिकोड / डी 2010 के लिए थोड़ा संशोधित):

uses libeay32;

const
  LIBEAY_DLL_NAME = 'libeay32.dll';
  EVP_MAX_MD_SIZE = 64;

function EVP_sha256: pEVP_MD; cdecl; external LIBEAY_DLL_NAME;
function HMAC(evp: pEVP_MD; key: PByte; key_len: integer; 
              data: PByte; data_len: integer; 
              md: PByte; var md_len: integer): PByte; cdecl; external LIBEAY_DLL_NAME;

function GetHMAC(const AKey, AData: string): TBytes;
var
  key, data: TBytes;
  md_len: integer;
  res: PByte;
begin
  OpenSSL_add_all_algorithms;
  // Seed the pseudo-random number generator
  // This should be something a little more "random"!
  RAND_load_file('c:\windows\paint.exe', 512);

  key := TEncoding.UTF8.GetBytes(AKey);
  data := TEncoding.UTF8.GetBytes(AData);
  md_len := EVP_MAX_MD_SIZE;
  SetLength(result, md_len);
  res := HMAC(EVP_sha256, @key[0], Length(key), @data[0], Length(data), @result[0], md_len);
  if (res <> nil) then
  begin
    SetLength(result, md_len);
  end;
end;

फिर इसे एक महत्वपूर्ण वाक्यांश और डेटा स्ट्रिंग के साथ कॉल करें। नतीजा एक टीबीइट्स है जिसे आवश्यक रूप में परिवर्तित किया जा सकता है जैसे कि बेस64 के लिए जेक्लीमयीम या एक सरल हेक्सटॉस्ट्रिंग प्रकार फ़ंक्शन जैसे कुछ का उपयोग करना।
डेल्फी के पुराने संस्करण के लिए आपको पीबीएट्स को पीसीहर्स या कुछ इसी तरह बदलना होगा।
अस्वीकरण: मुझे इसका परीक्षण करने के लिए कोई संदर्भ डेटा नहीं मिला है, लेकिन यह ठीक काम करने लगता है!


इंडी स्थापित डेल्फी जहाज, और इंडी में एक TIdHMACSHA256 वर्ग है:

uses
  IdGlobal, IdHashSHA, IdHMAC, IdHMACSHA1, IdSSLOpenSSL;

function CalculateHMACSHA256(const value, salt: String): String;
var
  hmac: TIdHMACSHA256;
  hash: TIdBytes;
begin
  LoadOpenSSLLibrary;
  if not TIdHashSHA256.IsAvailable then
    raise Exception('SHA256 hashing is not available!');
  hmac := TIdHMACSHA256.Create;
  try
    hmac.Key := IndyTextEncoding_UTF8.GetBytes(salt);
    hash := hmac.HashValue(IndyTextEncoding_UTF8.GetBytes(value));
    Result := ToHex(hash);
  finally
    hmac.Free;
  end;
end;


थोड़ी अधिक खोज के बाद मुझे ओपनस्ट्रीम एसईसी मिला - ऐसा लगता है कि यह कुछ साल पहले छोड़ दिया गया था, लेकिन अभी भी डी 2007 में संकलित किया गया है।

http://sourceforge.net/projects/openstrsecii/

अमेज़ॅन के लिए एक एचएमएसी -256 उत्पन्न करना वास्तव में सरल है:

StrToMime64(HMACString(haSHA256, SecretKey, 32, DataToHash));