檢視原始碼 引擎儲存金鑰

本章描述 crypto 應用程式對使用儲存在加密引擎中的公鑰和私鑰的支援。

背景

OpenSSL 公開了一個引擎 API,可以插入 OpenSSL 實作的某些加密操作的替代實作。有關詳細資訊以及如何載入引擎,請參閱 引擎載入 章節。

引擎可以執行其他任務,例如為私鑰或公鑰提供儲存空間。這種儲存空間可能比一般檔案系統更安全。這些技術在本使用者指南中沒有說明。在這裡,我們專注於如何使用儲存在這種引擎中的私鑰或公鑰。

儲存引擎必須呼叫 ENGINE_set_load_privkey_functionENGINE_set_load_pubkey_function。請參閱 OpenSSL 加密庫的 manpages

OTP/Crypto 要求使用者提供有關金鑰的兩到三項資訊。使用者使用的應用程式通常位於較高的層級,例如在 SSL 中。如果直接使用 crypto 應用程式,則需要:

  • 載入一個引擎,請參閱關於 引擎載入參考手冊 的章節
  • 可以使用引擎中的金鑰參考。這應該是一個 Erlang 字串或二進制資料,並取決於載入的引擎
  • 使用引擎參考、金鑰參考以及引擎可能需要的金鑰密碼短語建構一個 Erlang map。有關 map 的詳細資訊,請參閱 參考手冊

使用案例

使用引擎儲存的私鑰簽名

此範例顯示如何建構在簽名操作中使用的金鑰參考。實際的金鑰儲存在提示 1 載入的引擎中。

1> {ok, EngineRef} = crypto:engine_load(....).
...
{ok,#Ref<0.2399045421.3028942852.173962>}
2> PrivKey = #{engine => EngineRef,
               key_id => "id of the private key in Engine"}.
...
3> Signature = crypto:sign(rsa, sha, <<"The message">>, PrivKey).
<<65,6,125,254,54,233,84,77,83,63,168,28,169,214,121,76,
  207,177,124,183,156,185,160,243,36,79,125,230,231,...>>

使用引擎儲存的公鑰驗證

這裡使用公鑰驗證上一個範例中的簽名和訊息。公鑰儲存在引擎中,只是為了舉例說明這是可能的。當然,公鑰可以像往常一樣公開處理。

4> PublicKey = #{engine => EngineRef,
                 key_id => "id of the public key in Engine"}.
...
5> crypto:verify(rsa, sha, <<"The message">>, Signature, PublicKey).
true
6>

使用密碼保護的私鑰

與第一個簽名範例相同,只是密碼保護了引擎中的金鑰。

6> PrivKeyPwd = #{engine => EngineRef,
                  key_id => "id of the pwd protected private key in Engine",
		  password => "password"}.
...
7> crypto:sign(rsa, sha, <<"The message">>, PrivKeyPwd).
<<140,80,168,101,234,211,146,183,231,190,160,82,85,163,
  175,106,77,241,141,120,72,149,181,181,194,154,175,76,
  223,...>>
8>