# Server Key Management ```python %load_ext sql ``` ```python %config SqlMagic.feedback=False %config SqlMagic.displaycon=False %sql postgresql://postgres@/ ``` The core feature of pgsodium its its ability to manage encryption keys for you, you so that you never reference a raw encryption key, but instead you reference keys *by ID*. A key id is a UUID that uniquely identifies the key used. An example of using Server Key Management can be found in the section on [Transparent Column Encryption](Transparent_Column_Encryption.md) and is most of the API examples that can take key UUIDs are arguments. ## The hidden root key ## Create a new Key pgsodium can manage two types of keys, *derived* keys, and *external* keys. Derived keys use libsodium to Server managed keys are created with the `pgsodium.create_key()` function. This function takes a few optional parameters: - `key_type`: The type of key to create, the default is `aead-det`. Can be one of: - `aead-det` - `aead-ietf` - `hmacsha512` - `hmacsha256` - `auth` - `secretbox` - `secretstream` - `shorthash` - `generichash` - `kdf` - `name`: An optional *unique* name for the key. The default is NULL which makes an "anonymous" key. - `derived_key`: An optional raw external key, for example an hmac key from an external service. pgsodium will store this key encrypted with TCE. - `derived_key_nonce`: An optional nonce for the raw key, if none is provided a new random `aead-det` nonce will be generated using `pgsodium.crypto_aead_det_noncegen()`. - `parent_key`: If `raw_key` is not null, then this key id is used to encrypt the raw key. The default is to generate a new `aead-det` key. - `derived_context` - `expires` - `associated_data` `pgsodium.create_key()` returns a new row in the `pgsodium.valid_key` view. For most purposes, you usually just need the new key's ID to start using it. For example, here's a new external shahmac256 key being created and used to verify a payload: ```python external_key = %sql select pgsodium.crypto_auth_hmacsha256_keygen() external_key = bytes(external_key[0][0]) print(external_key) ``` b'\x1d\xa5\xf2\xa0a\xa8\x03 \x9b\x88J\xfe\xd2Xc\x0cG\xc5{\xc3W\xd7\x91KXp\x87\x15\x02"\xd6\xf6' ```python %sql select * from pgsodium.create_key('hmacsha256', raw_key:=:external_key) ```
id name status key_type key_id key_context created expires associated_data
92e24493-2df6-422b-8c75-00c82b1097c4 None valid hmacsha256 None None 2022-09-05 19:46:07.340760+00:00 None
```python %sql select id, key_type, parent_key, length(decrypted_raw_key) from pgsodium.decrypted_key where key_type = 'hmacsha256'; ```
id key_type parent_key length
5a8720af-50aa-4bd9-a9f1-c71065e75a88 hmacsha256 451843b3-74f8-4458-bc2d-5a88c6024832 32
9fac7ff7-10d7-4139-966b-f7317e4486b2 hmacsha256 a1f91b67-2793-4788-ab8e-4fca32e360da 32
92e24493-2df6-422b-8c75-00c82b1097c4 hmacsha256 cc815230-06c6-4d57-9780-ac2a2dc026bc 32