Package org.apache.hadoop.crypto.key
Class KeyProvider
java.lang.Object
org.apache.hadoop.crypto.key.KeyProvider
- All Implemented Interfaces:
Closeable,AutoCloseable
- Direct Known Subclasses:
JavaKeyStoreProvider,KeyProviderExtension,KMSClientProvider,LoadBalancingKMSClientProvider,UserProvider
A provider of secret key material for Hadoop applications. Provides an
abstraction to separate key storage from users of encryption. It
is intended to support getting or storing keys in a variety of ways,
including third party bindings.
KeyProvider implementations must be thread safe.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionstatic classThe combination of both the key version name and the key material.static classKey metadata that is associated with the key.static classOptions when creating key objects. -
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected static StringbuildVersionName(String name, int version) Build a version string from a basename and version number.voidclose()Can be used by implementing classes to close any resources that require closingabstract KeyProvider.KeyVersioncreateKey(String name, byte[] material, KeyProvider.Options options) Create a new key.createKey(String name, KeyProvider.Options options) Create a new key generating the material for it.abstract voidDelete the given key.static KeyProviderfindProvider(List<KeyProvider> providerList, String keyName) Find the provider with the given key.abstract voidflush()Ensures that any changes to the keys are written to persistent store.protected byte[]generateKey(int size, String algorithm) Generates a key material.static StringgetBaseName(String versionName) Split the versionName in to a base name.getConf()Return the provider configuration.getCurrentKey(String name) Get the current version of the key, which should be used for encrypting new data.getKeys()Get the key names for all keys.getKeysMetadata(String... names) Get key metadata in bulk.abstract KeyProvider.KeyVersiongetKeyVersion(String versionName) Get the key material for a specific version of the key.abstract List<KeyProvider.KeyVersion>getKeyVersions(String name) Get the key material for all versions of a specific key name.abstract KeyProvider.MetadatagetMetadata(String name) Get metadata about the key.voidinvalidateCache(String name) Can be used by implementing classes to invalidate the caches.booleanIndicates whether this provider represents a store that is intended for transient use - such as the UserProvider is.booleanDoes this provider require a password?If a password for the provider is needed, but is not provided, this will return an error message and instructions for supplying said password to the provider.If a password for the provider is needed, but is not provided, this will return a warning and instructions for supplying said password to the provider.static KeyProvider.Optionsoptions(Configuration conf) A helper function to create an options object.rollNewVersion(String name) Roll a new version of the given key generating the material for it.abstract KeyProvider.KeyVersionrollNewVersion(String name, byte[] material) Roll a new version of the given key.
-
Field Details
-
DEFAULT_CIPHER_NAME
- See Also:
-
DEFAULT_CIPHER
- See Also:
-
DEFAULT_BITLENGTH_NAME
- See Also:
-
DEFAULT_BITLENGTH
public static final int DEFAULT_BITLENGTH- See Also:
-
JCEKS_KEY_SERIALFILTER_DEFAULT
- See Also:
-
JCEKS_KEY_SERIAL_FILTER
- See Also:
-
-
Constructor Details
-
KeyProvider
Constructor.- Parameters:
conf- configuration for the provider
-
-
Method Details
-
getConf
Return the provider configuration.- Returns:
- the provider configuration
-
options
A helper function to create an options object.- Parameters:
conf- the configuration to use- Returns:
- a new options object
-
isTransient
public boolean isTransient()Indicates whether this provider represents a store that is intended for transient use - such as the UserProvider is. These providers are generally used to provide access to keying material rather than for long term storage.- Returns:
- true if transient, false otherwise
-
getKeyVersion
Get the key material for a specific version of the key. This method is used when decrypting data.- Parameters:
versionName- the name of a specific version of the key- Returns:
- the key material
- Throws:
IOException- raised on errors performing I/O.
-
getKeys
Get the key names for all keys.- Returns:
- the list of key names
- Throws:
IOException- raised on errors performing I/O.
-
getKeysMetadata
Get key metadata in bulk.- Parameters:
names- the names of the keys to get- Returns:
- Metadata Array.
- Throws:
IOException- raised on errors performing I/O.
-
getKeyVersions
Get the key material for all versions of a specific key name.- Parameters:
name- the base name of the key.- Returns:
- the list of key material
- Throws:
IOException- raised on errors performing I/O.
-
getCurrentKey
Get the current version of the key, which should be used for encrypting new data.- Parameters:
name- the base name of the key- Returns:
- the version name of the current version of the key or null if the key version doesn't exist
- Throws:
IOException- raised on errors performing I/O.
-
getMetadata
Get metadata about the key.- Parameters:
name- the basename of the key- Returns:
- the key's metadata or null if the key doesn't exist
- Throws:
IOException- raised on errors performing I/O.
-
createKey
public abstract KeyProvider.KeyVersion createKey(String name, byte[] material, KeyProvider.Options options) throws IOException Create a new key. The given key must not already exist.- Parameters:
name- the base name of the keymaterial- the key material for the first version of the key.options- the options for the new key.- Returns:
- the version name of the first version of the key.
- Throws:
IOException- raised on errors performing I/O.
-
generateKey
Generates a key material.- Parameters:
size- length of the key.algorithm- algorithm to use for generating the key.- Returns:
- the generated key.
- Throws:
NoSuchAlgorithmException- no such algorithm exception.
-
createKey
public KeyProvider.KeyVersion createKey(String name, KeyProvider.Options options) throws NoSuchAlgorithmException, IOException Create a new key generating the material for it. The given key must not already exist.This implementation generates the key material and calls the
createKey(String, byte[], Options)method.- Parameters:
name- the base name of the keyoptions- the options for the new key.- Returns:
- the version name of the first version of the key.
- Throws:
IOException- raised on errors performing I/O.NoSuchAlgorithmException- no such algorithm exception.
-
deleteKey
Delete the given key.- Parameters:
name- the name of the key to delete- Throws:
IOException- raised on errors performing I/O.
-
rollNewVersion
public abstract KeyProvider.KeyVersion rollNewVersion(String name, byte[] material) throws IOException Roll a new version of the given key.- Parameters:
name- the basename of the keymaterial- the new key material- Returns:
- the name of the new version of the key
- Throws:
IOException- raised on errors performing I/O.
-
close
Can be used by implementing classes to close any resources that require closing- Specified by:
closein interfaceAutoCloseable- Specified by:
closein interfaceCloseable- Throws:
IOException
-
rollNewVersion
public KeyProvider.KeyVersion rollNewVersion(String name) throws NoSuchAlgorithmException, IOException Roll a new version of the given key generating the material for it.This implementation generates the key material and calls the
rollNewVersion(String, byte[])method.- Parameters:
name- the basename of the key- Returns:
- the name of the new version of the key
- Throws:
IOException- raised on errors performing I/O.NoSuchAlgorithmException- This exception is thrown when a particular cryptographic algorithm is requested but is not available in the environment.
-
invalidateCache
Can be used by implementing classes to invalidate the caches. This could be used after rollNewVersion to provide a strong guarantee to return the new version of the given key.- Parameters:
name- the basename of the key- Throws:
IOException- raised on errors performing I/O.
-
flush
Ensures that any changes to the keys are written to persistent store.- Throws:
IOException- raised on errors performing I/O.
-
getBaseName
Split the versionName in to a base name. Converts "/aaa/bbb@3" to "/aaa/bbb".- Parameters:
versionName- the version name to split- Returns:
- the base name of the key
- Throws:
IOException- raised on errors performing I/O.
-
buildVersionName
Build a version string from a basename and version number. Converts "/aaa/bbb" and 3 to "/aaa/bbb@3".- Parameters:
name- the basename of the keyversion- the version of the key- Returns:
- the versionName of the key.
-
findProvider
public static KeyProvider findProvider(List<KeyProvider> providerList, String keyName) throws IOException Find the provider with the given key.- Parameters:
providerList- the list of providerskeyName- the key name we are looking for.- Returns:
- the KeyProvider that has the key
- Throws:
IOException- raised on errors performing I/O.
-
needsPassword
Does this provider require a password? This means that a password is required for normal operation, and it has not been found through normal means. If true, the password should be provided by the caller using setPassword().- Returns:
- Whether or not the provider requires a password
- Throws:
IOException- raised on errors performing I/O.
-
noPasswordWarning
If a password for the provider is needed, but is not provided, this will return a warning and instructions for supplying said password to the provider.- Returns:
- A warning and instructions for supplying the password
-
noPasswordError
If a password for the provider is needed, but is not provided, this will return an error message and instructions for supplying said password to the provider.- Returns:
- An error message and instructions for supplying the password
-