MySQL 伺服器支援金鑰環服務,讓內部元件和外掛程式能夠安全地儲存敏感資訊,以便稍後擷取。MySQL 發行版本提供可從兩個層級存取的金鑰環介面
在 SQL 層級,作為一組可載入函數,每個函數都對應到對服務常式的呼叫。
作為 C 語言介面,可作為伺服器外掛程式或可載入函數的外掛程式服務呼叫。
本節說明如何使用金鑰環服務函數在 MySQL 金鑰環金鑰儲存區中儲存、擷取和移除金鑰。如需有關使用函數的 SQL 介面資訊,請參閱第 8.4.4.12 節「通用金鑰環金鑰管理函數」。如需一般金鑰環資訊,請參閱第 8.4.4 節「MySQL 金鑰環」。
金鑰環服務使用任何已啟用的基礎金鑰環外掛程式 (如果有的話)。如果未啟用任何金鑰環外掛程式,金鑰環服務呼叫會失敗。
金鑰儲存區中的「記錄」包含資料 (金鑰本身) 和用於存取金鑰的唯一識別碼。識別碼有兩個部分
key_id
:金鑰 ID 或名稱。以mysql_
開頭的key_id
值由 MySQL 伺服器保留。user_id
:工作階段有效使用者 ID。如果沒有使用者內容,此值可以是NULL
。該值實際上不必是「使用者」;其含義取決於應用程式。實作金鑰環函數介面的函數會將
CURRENT_USER()
的值作為user_id
值傳遞給金鑰環服務函數。
金鑰環服務函數具有下列共同特性
每個函數成功傳回 0,失敗傳回 1。
key_id
和user_id
引數形成唯一的組合,表示要使用金鑰環中的哪個金鑰。key_type
引數提供有關金鑰的其他資訊,例如其加密方法或預期用途。金鑰環服務函數將金鑰 ID、使用者名稱、類型和值視為二進位字串,因此比較會區分大小寫。例如,
MyKey
和mykey
的 ID 是指不同的金鑰。
可以使用下列金鑰環服務函數
my_key_fetch()
從金鑰環中解混淆並擷取金鑰及其類型。該函數會配置用於儲存傳回的金鑰和金鑰類型的緩衝區記憶體。呼叫者在不再需要時應將記憶體歸零或混淆,然後釋放它。
語法
bool my_key_fetch(const char *key_id, const char **key_type, const char* user_id, void **key, size_t *key_len)
引數
key_id
、user_id
:以空字元結尾的字串,成對形成唯一識別碼,表示要擷取的金鑰。key_type
:緩衝區指標的位址。該函數會將一個指標儲存到其中,此指標指向以空字元結尾的字串,提供有關金鑰的其他資訊 (在新增金鑰時儲存)。key
:緩衝區指標的位址。該函數會將一個指標儲存到其中,此指標指向包含擷取的金鑰資料的緩衝區。key_len
:變數的位址,函數會將*key
緩衝區的大小 (以位元組為單位) 儲存到其中。
傳回值
成功傳回 0,失敗傳回 1。
my_key_generate()
產生給定類型和長度的新隨機金鑰,並將其儲存在金鑰環中。金鑰的長度為
key_len
,並與由key_id
和user_id
組成的識別碼相關聯。類型和長度值必須與基礎金鑰環外掛程式支援的值一致。請參閱第 8.4.4.10 節「支援的金鑰環金鑰類型和長度」。語法
bool my_key_generate(const char *key_id, const char *key_type, const char *user_id, size_t key_len)
引數
key_id
、user_id
:以空字元結尾的字串,成對形成要產生之金鑰的唯一識別碼。key_type
:以空字元結尾的字串,提供有關金鑰的其他資訊。key_len
:要產生之金鑰的大小 (以位元組為單位)。
傳回值
成功傳回 0,失敗傳回 1。
my_key_remove()
從金鑰環中移除金鑰。
語法
bool my_key_remove(const char *key_id, const char* user_id)
引數
key_id
、user_id
:以空字元結尾的字串,成對組合構成要移除的金鑰的唯一識別碼。
傳回值
成功傳回 0,失敗傳回 1。
my_key_store()
對金鑰進行混淆處理並將其儲存在金鑰環中。
語法
bool my_key_store(const char *key_id, const char *key_type, const char* user_id, void *key, size_t key_len)
引數
key_id
、user_id
:以空字元結尾的字串,成對組合構成要儲存的金鑰的唯一識別碼。key_type
:以空字元結尾的字串,提供有關金鑰的其他資訊。key
:包含要儲存的金鑰資料的緩衝區。key_len
:key
緩衝區的大小(以位元組為單位)。
傳回值
成功傳回 0,失敗傳回 1。