下面的這個HMACSHA1代碼適用於將「密碼」和「消息」轉換爲AFF791FA574D564C83F6456CC198CBD316949DC9
,作爲http://buchananweb.co.uk/security01.aspx的證據。C++ OpenSSL HMACSHA1的工作原理但不是我想要的方式
我的問題是,它是有可能的:
BYTE HMAC[] = {0x50,0x61,0x73,0x73,0x77,0x6F,0x72,0x64};
BYTE data2[] = {0x4D,0x65,0x73,0x73,0x61,0x67,0x65};
,仍然可以得到相同的值:AFF791FA574D564C83F6456CC198CBD316949DC9
。
例如,如果我是一個服務器上接收到的數據包:
[HEADER] 08 50 61 73 73 77 6F 72 64 00
[HEADER] 07 4D 65 73 73 61 67 65 00
我撕裂50 61 73 73 77 6F 72 64
& 4D 65 73 73 61 67 65
從包和使用這個對我的HMACSHA1。我將如何去做這件事來獲得正確的HMACSHA1值?
BYTE HMAC[] = "Password";
BYTE data2[] = "Message";
//BYTE HMAC[] = {0x50,0x61,0x73,0x73,0x77,0x6F,0x72,0x64};
//BYTE data2[] = {0x4D,0x65,0x73,0x73,0x61,0x67,0x65};
HMAC_CTX ctx;
result = (unsigned char*) malloc(sizeof(char) * result_len);
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, HMAC, strlen((const char*)HMAC), EVP_sha1(), NULL);
HMAC_Update(&ctx, data2, strlen((const char*)(data2)));
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);
std::cout << "\n\n";
for(int i=0;i<result_len;i++)
std::cout << setfill('0') << setw(2) << hex << (int)result[i];
int asd;
std::cin >> asd;
// AFF791FA574D564C83F6456CC198CBD316949DC9
編輯:
其工作原理是這樣:
BYTE HMAC[] = {0x50,0x61,0x73,0x73,0x77,0x6F,0x72,0x64, 0x00};
BYTE data2[] = {0x4D,0x65,0x73,0x73,0x61,0x67,0x65, 0x00};
通過添加爲0x00,在最後。但是,我的問題更多的是將它從數據中剝離出來,然後使用它......它會一直很好嗎?
'int a_len = 9; int b_len = a HMAC_Init_ex(&ctx,HMAC,a_len,EVP_sha1(),NULL); HMAC_Update(&ctx,data2,b_len);' 這會更好嗎? – user954753
a_len = 8; b_len = 7(因爲「密碼」的長度是8個字符,而「消息」是7個字符)。 – selbie
謝謝,我會這樣做:-) – user954753