카테고리 없음

[델파이] 델파이의 HMAC-SHA256

행복을전해요 2021. 1. 6. 17:11

Delphi는 Indy가 설치된 상태로 제공되며 Indy에는 다음과 같은 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.Create('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;
                                      
-------------------

조금 더 검색 한 후 OpenStreamSec을 찾았습니다. OpenStreamSec은 몇 년 전에 버려졌지만 여전히 D2007에서 컴파일됩니다.

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

Amazon 용 HMAC-256 생성은 정말 간단합니다.

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

내가 가장 좋아하는 대답은 HMAC 기능인 OpenSSL 라이브러리를 사용하는 것입니다. M Ferrante http://www.disi.unige.it/person/FerranteM/delphiopenssl/의 작업을 채택하고 조정하여 Delphi에서 OpenSSL 라이브러리를 성공적으로 사용했습니다.
다른 OpenSSL 서명 등에 대해서는 이 링크를 참조하십시오
. D2010에서는 다음과 같습니다. (libeay32는 웹 사이트에서 가져온 단위이며 unicode / D2010 용으로 약간 수정되었습니다) :

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;
                                                                  

그런 다음 키 구문과 데이터 문자열로 호출하십시오. 결과는 JclMime 또는 간단한 HexToString 유형 함수와 같은 것을 사용하여 필요에 따라 Base64로 변환 할 수있는 TBytes입니다.
이전 버전의 Delphi의 경우 PBytes를 PChars 또는 이와 유사한 것으로 약간 변경해야합니다.
면책 조항 : 테스트 할 참조 데이터가 없지만 정상적으로 작동하는 것 같습니다!

-------------------

이 SO 질문에 대한 답변을 보셨습니까 ?

-------------------

HMAC는 정의 된 규칙에 따라 SHA256을 사용하여 해시를 계산하는 함수입니다. 당신이 보면 위키 백과 그것은이 의사의 예를.

COM interrop을 통해 System.Security.Cryptography에서 .NET의 HMAC 클래스호출 할 수도 있습니다 .

-------------------

Jacob의 답변과 관련하여 : OpenStrSecII는 StreamSec Tools 2.1의 한 분기로, 상용 라이센스로 판매되고 있으며 현재 (2012 년 2 월 8 일) Delphi XE2까지 Delphi Win32를 지원합니다. StreamSec Tools 4.0은 Win64도 지원합니다.

-------------------

웹을 검색 할 때 Delphi10에서 올바르게 컴파일하는 것도 발견했습니다.

result:= (TNetEncoding.Base64.EncodeBytesToString(THashSHA2.GetHMACAsBytes(TEncoding.UTF8.GetBytes(StringToSign),TNetEncoding.Base64.DecodeStringToBytes(Key))));

진행중인 프로세스에 문제가 있지만이 기능과 관련이 있는지 확실하지 않습니다.



출처
https://stackoverflow.com/questions/2005840