これは非常に基本的な質問ですが、EVPとHMACの違いは何ですか? EVPはメッセージダイジェストですが、HMACによって生成されるものとはどのように違いますか?OpenSSLでのHMACとEVPの機能の使用
6
A
答えて
5
EVPとHMACの間の機能は、ハイレベルのインターフェースものであるています。...差
EVP_*
HMAC_*
,
AES_*
、およびフレンドは下位レベルのプリミティブです。いずれかで作業することもできますが、
EVP_*
の機能を使用することをお勧めします。
HMAC_*
ルーチンはソフトウェアベースであり、ハードウェアを使用しません。
EVP_*
関数を使用すると、異なるハッシュで簡単にスワップでき、コードは基本的に同じままです。また、AES-CMACのAES-NIなどのハードウェアアクセラレーションを利用できます(利用可能な場合)。
ここにはhttps://www.openssl.org/docs/crypto/EVP_DigestInit.htmlに基づくOpenSSLの例があります。
EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;
char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("SHA1");
mdctx = EVP_MD_CTX_create();
if(!EVP_DigestInit_ex(mdctx, md, NULL))
handleError();
if(!EVP_DigestUpdate(mdctx, message, strlen(message)))
handleError();
if(!EVP_DigestFinal_ex(mdctx, md_value, &md_len))
handleError();
if(!EVP_MD_CTX_destroy(mdctx))
handleError();
printf("Digest is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
ここで、HMACはハッシュとわずかに異なります。 HMACはキー付きハッシュですが、ハッシュはキー付きではありません。 HMACのためにEVP_*
関数を使用することもできます。以下は、OpenSSLののwikiページEVP Signing and Verifyingからさ:
EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
EVP_PKEY *pkey = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;
char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";
OpenSSL_add_all_digests();
if(!(mdctx = EVP_MD_CTX_create()))
handleError();
if(!(md = EVP_get_digestbyname("SHA1")))
handleError();
if(!(pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL, "password", strlen("password"))))
handleError();
if(1 != EVP_DigestSignInit(mdctx, NULL, md, NULL, pkey))
handleError();
/* Call update with the message */
if(1 != EVP_DigestSignUpdate(mdctx, message, strlen(message)))
handleError();
if(1 != EVP_DigestSignFinal(mdctx, md_value, &md_len))
handleError();
printf("HMAC is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
低レベルのインタフェースは次のようになります。
EVP_MD_CTX* mdctx = NULL;
const EVP_MD* md = NULL;
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len = 0;
char message[] = "Now is the time for all good men to "
"come to the aide of their country\n";
OpenSSL_add_all_digests();
md = EVP_get_digestbyname("SHA1");
mdctx = EVP_MD_CTX_create();
if(!HMAC_Init_ex(mdctx, key, sizeof(key), md, NULL))
handleError();
if(!HMAC_Update(mdctx, message, strlen(message)))
handleError();
if(!HMAC_Final(mdctx, md_value, &md_len))
handleError();
if(!HMAC_CTX_cleanup(mdctx))
handleError();
printf("HMAC is: ");
for(int i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
1
あなたはHMACのための右のキー構造を得るためにEVP_PKEY_new_mac_key機能を使用する必要があります。 EVP_PKEY_freeでそれを解放することを忘れないでください。
関連する問題
- 1. opensslのEVP APIを使用して公開鍵で解読することは可能ですか
- 2. SHA1のHMACなし機能
- 3. openssl evp api(aes256cbc)を使用してファイルを暗号化する際の問題
- 4. xcodeを使用したOpenSSL ecc機能?
- 5. nsベクトル値を入力として使用するopenssl hmacコードの検証システム
- 6. JmeterでのHMAC認証の使用
- 7. コンソールコマンドから機能へのOpenSSL
- 8. ランタイムでのプレゼンテーションと機能の使用
- 9. OpenSSLのC++での実装を使用
- 10. OpenSSL API:CRLチェックが機能しません
- 11. OpenSSLでEVP暗号を解読した後、平文の8バイトが常に正しくない
- 12. このコマンドの機能:openssl rsa -in ner.pk -check
- 13. JavaでHMAC-Whirlpoolを使用する
- 14. プライベートAPI専用のHMAC
- 15. Oracleでの機能インデックスの使用
- 16. Adobe Airでの機能の使用
- 17. SmartyでのPOST機能の使用
- 18. ヘッダー機能の使用
- 19. plotly.jsアニメーション機能の使用
- 20. Expressの使用機能
- 21. PythonのHMAC base64で
- 22. EXCELのログイン機能でMID機能を使用
- 23. Ember - 他のコントローラー機能でコントローラー機能を使用する
- 24. EF 4でのエンティティのカスタマイズと検証機能の使用
- 25. ループ内でのmultiprocessing.poolの使用とターゲット機能の更新
- 26. OpenSSL BN_exp()使用法
- 27. Android用OpenSSLのコンパイルと使用(eclipseを使用しているウィンドウで)
- 28. iOSのFirebase用クラウド機能の使用
- 29. OpenCV機能を使用したグレースケール画像用のVideowriter機能
- 30. のweb2py:LOADで使用する機能(アヤックス)
コードに大きな問題があります。 '' 'key'''は' '' 'unsigned char''配列ではなく、' '' EVP_PKEY''です。また、いくつかのタイプミスがあります。 – jcoffland
私はEVP_PKEY(http://wiki.openssl.org/index.php/EVP_Key_and_Parameter_Generationでもっとたくさん)を作成する方法を掘り出しました –
これを使ってCMACを計算する方法??? – user489152