[델파이] 델파이의 HMAC-SHA256
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