檢視原始碼 引擎儲存金鑰
本章描述 crypto 應用程式對使用儲存在加密引擎中的公鑰和私鑰的支援。
背景
OpenSSL 公開了一個引擎 API,可以插入 OpenSSL 實作的某些加密操作的替代實作。有關詳細資訊以及如何載入引擎,請參閱 引擎載入 章節。
引擎可以執行其他任務,例如為私鑰或公鑰提供儲存空間。這種儲存空間可能比一般檔案系統更安全。這些技術在本使用者指南中沒有說明。在這裡,我們專注於如何使用儲存在這種引擎中的私鑰或公鑰。
儲存引擎必須呼叫 ENGINE_set_load_privkey_function
和 ENGINE_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>