Package net.shibboleth.shared.security
Class DataSealer
java.lang.Object
net.shibboleth.shared.component.AbstractInitializableComponent
net.shibboleth.shared.security.DataSealer
- All Implemented Interfaces:
Component,DestructableComponent,InitializableComponent
Applies a MAC to time-limited information and encrypts with a symmetric key.
TODO: make final
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final intSize of UTF-8 data chunks to read/write.private org.apache.commons.codec.BinaryDecoderDecodes encrypted string to bytes.private org.apache.commons.codec.BinaryEncoderEncodes encrypted bytes to string.private DataSealerKeyStrategySource of keys.private booleanWhether the key source is expected to be locked initially.private org.slf4j.LoggerClass logger.static final StringMagic string to signal use of per-node prefix feature.private StringOptional per-server node prefix to affix to encoded values.private static final intLength of padded prefix.private SecureRandomSource of secure random data. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoidprivate StringextractAndCheckDecryptedData(byte[] decryptedBytes) Extract the GZIP'd data and test for expiration before returning it.voidsetDecoder(org.apache.commons.codec.BinaryDecoder d) Sets the decoder to use to convert a ciphertext string to bytes.voidsetEncoder(org.apache.commons.codec.BinaryEncoder e) Sets the encoder to use to produce a ciphertext string from bytes.voidsetKeyStrategy(DataSealerKeyStrategy strategy) Set the key strategy.voidsetLockedAtStartup(boolean flag) Set whether the key source is expected to be locked at startup, and unlocked later at runtime.voidsetNodePrefix(String prefix) Set a prefix to affix to wrapped values to support signaling to load balancers, etc.voidSet the pseudorandom generator.private voidtestEncryption(SecretKey key) Run a test over the configured bean properties.Decrypts and verifies an encrypted bundle created withwrap(String, Instant).unwrap(String wrapped, StringBuffer keyUsed) Decrypts and verifies an encrypted bundle created withwrap(String, Instant), optionally returning the label of the key used to encrypt the data.Equivalent towrap(String, Instant)with expiration set to "never".Encodes data into an AEAD-encrypted blob, gzip(exp|data) exp = expiration time of the data; 8 bytes; Big-endian data = the data; a UTF-8-encoded stringMethods inherited from class net.shibboleth.shared.component.AbstractInitializableComponent
checkComponentActive, checkSetterPreconditions, destroy, doDestroy, ifDestroyedThrowDestroyedComponentException, ifInitializedThrowUnmodifiabledComponentException, ifNotInitializedThrowUninitializedComponentException, initialize, isDestroyed, isInitialized
-
Field Details
-
MAGIC_STRING
Magic string to signal use of per-node prefix feature.- See Also:
-
PREFIX_LEN
private static final int PREFIX_LENLength of padded prefix.- See Also:
-
CHUNK_SIZE
private static final int CHUNK_SIZESize of UTF-8 data chunks to read/write.- See Also:
-
log
@Nonnull private org.slf4j.Logger logClass logger. -
lockedAtStartup
private boolean lockedAtStartupWhether the key source is expected to be locked initially. -
keyStrategy
Source of keys. -
random
Source of secure random data. -
encoder
@Nonnull private org.apache.commons.codec.BinaryEncoder encoderEncodes encrypted bytes to string. -
decoder
@Nonnull private org.apache.commons.codec.BinaryDecoder decoderDecodes encrypted string to bytes. -
nodePrefix
Optional per-server node prefix to affix to encoded values.
-
-
Constructor Details
-
DataSealer
public DataSealer()Constructor.
-
-
Method Details
-
setLockedAtStartup
public void setLockedAtStartup(boolean flag) Set whether the key source is expected to be locked at startup, and unlocked later at runtime.Defaults to false.
- Parameters:
flag- flag to set- Since:
- 7.4.0
-
setRandom
Set the pseudorandom generator.- Parameters:
r- the pseudorandom generator to set
-
setEncoder
public void setEncoder(@Nonnull org.apache.commons.codec.BinaryEncoder e) Sets the encoder to use to produce a ciphertext string from bytes. Default is standard base-64 encoding without line breaks.- Parameters:
e- Byte-to-string encoder.
-
setDecoder
public void setDecoder(@Nonnull org.apache.commons.codec.BinaryDecoder d) Sets the decoder to use to convert a ciphertext string to bytes. Default is standard base-64 decoding.- Parameters:
d- String-to-byte decoder.
-
setNodePrefix
Set a prefix to affix to wrapped values to support signaling to load balancers, etc.The prefix will itself be prefixed by
MAGIC_STRINGfor compatibility with unprefixed values.- Parameters:
prefix- node prefix- Since:
- 8.3.0
-
doInitialize
- Overrides:
doInitializein classAbstractInitializableComponent- Throws:
ComponentInitializationException
-
unwrap
Decrypts and verifies an encrypted bundle created withwrap(String, Instant).- Parameters:
wrapped- the encoded blob- Returns:
- the decrypted data, if it's unexpired
- Throws:
DataSealerException- if the data cannot be unwrapped and verified
-
unwrap
@Nonnull public String unwrap(@Nonnull @NotEmpty String wrapped, @Nullable StringBuffer keyUsed) throws DataSealerException Decrypts and verifies an encrypted bundle created withwrap(String, Instant), optionally returning the label of the key used to encrypt the data.- Parameters:
wrapped- the encoded blobkeyUsed- a buffer to receive the alias of the key used to encrypt the data- Returns:
- the decrypted data, if it's unexpired
- Throws:
DataSealerException- if the data cannot be unwrapped and verified
-
extractAndCheckDecryptedData
@Nonnull private String extractAndCheckDecryptedData(@Nonnull @NotEmpty byte[] decryptedBytes) throws DataSealerException Extract the GZIP'd data and test for expiration before returning it.- Parameters:
decryptedBytes- the data we are looking at- Returns:
- the decoded data if it is valid and unexpired
- Throws:
DataSealerException- if the data cannot be unwrapped and verified
-
wrap
Equivalent towrap(String, Instant)with expiration set to "never".- Parameters:
data- the data to wrap- Returns:
- the encoded blob
- Throws:
DataSealerException- if the wrapping operation fails
-
wrap
@Nonnull public String wrap(@Nonnull @NotEmpty String data, @Nullable Instant exp) throws DataSealerException Encodes data into an AEAD-encrypted blob, gzip(exp|data)- exp = expiration time of the data; 8 bytes; Big-endian
- data = the data; a UTF-8-encoded string
As part of encryption, the key alias is supplied as additional authenticated data to the cipher. Afterwards, the encrypted data is prepended by the IV and then again by the alias (in length-prefixed UTF-8 format), which identifies the key used. Finally the result is base64-encoded.
- Parameters:
data- the data to wrapexp- expiration time or null for none- Returns:
- the encoded blob
- Throws:
DataSealerException- if the wrapping operation fails
-
testEncryption
Run a test over the configured bean properties.- Parameters:
key- key to test- Throws:
DataSealerException- if the test fails
-