2016-11-30 1 views
-1

J'utilise DLL externe dans les applications VCL pour calculer le hachage HMAC sha256, https://www.chilkatsoft.com/delphiDll.asp, j'ai besoin d'un moyen de le faire pour Android dans Delphi 10, je ne pouvais pas trouver tout qui fonctionne pour android dans delphi, ce le code pour le faire en utilisant DLLCalcul HMAC hachage dans Android en utilisant Delphi 10

function TForm2.HMAC(const s: pwidechar): string; 
var 
crypt: HCkCrypt2; 
success: Boolean; 
mac: PWideChar; 

begin 
crypt := CkCrypt2_Create(); 

// Any string argument automatically begins the 30-day trial. 
success := CkCrypt2_UnlockComponent(crypt,'Anything for 30-day trial.'); 
if (success <> True) then 
    begin 
    Exit; 
    end; 

// The output will be Hex, so set the EncodingMode: 
CkCrypt2_putEncodingMode(crypt,'hex'); 

// Set the hash algorithm: 
// Choices are: md5, sha-1, sha256, sha384, sha512, md2, haval 
CkCrypt2_putHashAlgorithm(crypt,'sha256'); 

// Set the HMAC key: 
CkCrypt2_SetHmacKeyEncoded(crypt,'my key','ascii'); 
mac := CkCrypt2__hmacStringENC(crypt,s); 
Result := (mac); 

CkCrypt2_Dispose(crypt); 

end; 

MISE à JOUR

j'ai trouvé un morceau de code pour obtenir le HMAC SHA256..but je ne pouvais pas comprendre comment cela fonctionne, comme le code ci-dessus?

var 
    Hash: TIdHMACSHA256 ; 
    HashValue: TBytes; 
    begin 
    SetCurrentDir(ExtractFilePath(ParamStr(0))); 
    Hash := TIdHMACSHA256 .Create; 
    try 
     Hash.Key := TEncoding.ASCII.GetBytes('devaee2'); 
     HashValue := Hash.HashValue(TFile.ReadAllBytes('menu.xml')); 
     // HashValue is an empty array, why? 
     Tag := Length(HashValue); 
     TFile.WriteAllBytes('menu.xml.hash', HashValue); 

    finally 
     FreeAndNil(Hash); 
    end; 
    end; 
+0

Indy fonctionne généralement très bien sur Android 6. L'utilisation d'OpenSSL par Indy ne fonctionne pas sur Android 6. Cependant, les classes de hachage et de HMAC d'Indy ne dépendent pas directement d'OpenSSL, mais peuvent utiliser OpenSSL. quand il est disponible L'unité 'IdFIPS' d'Indy a un tas de pointeurs de fonctions que vous pouvez pointer vers n'importe quelle API de hachage que vous voulez (l'unité' IdSSLOpenSSLHeaders' pointe vers les fonctions OpenSSL) pour les hachages que Indy n'implémente pas nativement (certains hashes, comme MD5 et SHA1, sont implémentés nativement). –

+0

Si l'on regarde la classe 'TIdHMAC', il semblerait qu'elle ignore certaines implémentations de hachage natives, en s'appuyant sur des bibliothèques externes. Je vais devoir regarder ça. –

+0

On dirait que seul 'TIdHMACSHA1' a été affecté. Je l'ai mis à jour pour utiliser maintenant l'implémentation SHA-1 native d'Indy lorsqu'une bibliothèque de hachage externe n'est pas disponible. 'TIdHMACMD5' utilisait déjà l'implémentation MD5 native d'Indy. –

Répondre

2

Il existe une méthode THashSHA2.GetHMAC() dans l'unité System.Hash. Il a un paramètre AHashVersion que vous pouvez définir sur TSHA2Version.SHA256 (qui est la valeur par défaut).

+0

Je suis à la recherche de HMAC SHA256 – unknown