简体   繁体   English

C ++和PHP中的不同结果HMAC SHA-256

[英]Different result HMAC SHA-256 in C++ and PHP

I encode string to base64 and generate HMAC SHA256 with this base64 string. 我将字符串编码为base64并使用此base64字符串生成HMAC SHA256。 I encode the result of HMAC(char bytes) to base64. 我将HMAC(char字节)的结果编码为base64。

I use C++: openssl library. 我使用C ++:openssl库。

And got a different results in PHP and C++: 在PHP和C ++中得到了不同的结果:

C++: C ++:

JSON: {"req_hash":"someUniqCodeHash","answer":true}

BASE64: eyJyZXFfaGFzaCI6InNvbWVVbmlxQ29kZUhhc2giLCJhbnN3ZXIiOnRydWV9

HMAC: P/p2YlxL8xdhmn+QIAlVLFDS50ai4JE/l1pMMrKZKrE=

PHP: PHP:

JSON: {"req_hash":"someUniqCodeHash","answer":true}

BASE64: eyJyZXFfaGFzaCI6InNvbWVVbmlxQ29kZUhhc2giLCJhbnN3ZXIiOnRydWV9

HMAC: P/p2YlxL8xdhmn+QIAlVLFDS50ai4JE/l1pMMrKZKrE=

And if you can see, HMAC same result ! 如果可以看到, HMAC的结果一样

c++: P/p2YlxL8xdhmn+QIAlVLFDS50ai4JE/l1pMMrKZKrE=

php: P/p2YlxL8xdhmn+QIAlVLFDS50ai4JE/l1pMMrKZKrE=

But, when I change JSON like this (changed true to false ) : 但是,当我像这样更改JSON(将true更改为false )时

JSON: {"req_hash":"someUniqCodeHash","answer":false}

i got this: 我懂了:

C++: C ++:

JSON: {"req_hash":"someUniqCodeHash","answer":false}

BASE64: eyJyZXFfaGFzaCI6InNvbWVVbmlxQ29kZUhhc2giLCJhbnN3ZXIiOmZhbHNlfQ==

HMAC: znUOWS2MMLpjIBSpq2GfSNivaL8IUDcZXZs24D0=

PHP: PHP:

JSON: {"req_hash":"someUniqCodeHash","answer":false}

BASE64: eyJyZXFfaGFzaCI6InNvbWVVbmlxQ29kZUhhc2giLCJhbnN3ZXIiOmZhbHNlfQ==

HMAC: znUOWS2MMLpjIBSpq2GfSNivaL8IUDcZXZs24D0AHZA=

Why the HMAC result is different? 为什么HMAC结果不同?

You can see: 您可以看到:

C++: znUOWS2MMLpjIBSpq2GfSNivaL8IUDcZXZs24D0=

PHP: znUOWS2MMLpjIBSpq2GfSNivaL8IUDcZXZs24D0AHZA=

In PHP HMAC string added some chars: ...AHZA= . 在PHP HMAC字符串中添加了一些字符: ...AHZA= What is this? 这是什么?

And my PHP code : 和我的PHP代码

 <?php
 $b = base64_encode('{"req_hash":"someUniqCodeHash","answer":false}');
 $hmac =$b.".".base64_encode(hash_hmac('sha256',$b,'eyJhZGRyZXNzX3RvIjp7JzEnOidjbGll',true));

My C++ code : 我的C ++代码

std::string sfjson = "{\"req_hash\":\"someUniqCodeHash\",\"answer\":false}";
std::cout << "JSON: " << sfjson << "\n";

std::string fencoded_data = base64_encode_str(sfjson);
std::cout << "BASE64: " << fencoded_data << "\n";

unsigned char* digest;
std::string key = "eyJhZGRyZXNzX3RvIjp7JzEnOidjbGll";

digest = HMAC(EVP_sha256(), reinterpret_cast<const unsigned char*>(key.c_str()), key.length(), reinterpret_cast<const unsigned char*>(fencoded_data.c_str()), fencoded_data.length(), NULL, NULL);

std::string sName(reinterpret_cast<char*>(digest));

std::string hmac_data = base64_encode_str(sName);

std::cout << "HMAC: " << hmac_data << "\n";

Base64 from there: https://gist.github.com/rustem-art/5f6b510c65bbbfd279386225b978f960 从那里开始的Base64: https : //gist.github.com/rustem-art/5f6b510c65bbbfd279386225b978f960

I found the solution! 我找到了解决方案! ;) ;)

Never use NULL as: 切勿将NULL用作:

digest = HMAC(EVP_sha256(),
              reinterpret_cast<const unsigned char*>(key.c_str()), key.length(),
              reinterpret_cast<const unsigned char*>(data.c_str()), data.length(),
              NULL, NULL);

Use special variable (in my code is: diglen and result) for return function. 为返回函数使用特殊变量(在我的代码中为:diglen和result)。

unsigned int diglen;

unsigned char result[EVP_MAX_MD_SIZE];

digest = HMAC(EVP_sha256(),
              reinterpret_cast<const unsigned char*>(key.c_str()), key.length(),
              reinterpret_cast<const unsigned char*>(data.c_str()), data.length(),
              result, &diglen);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM