-
Notifications
You must be signed in to change notification settings - Fork 460
EncryptionRecipes
Demonstrates how to use different encryption and signing algorithms in Apex
Recomputes HMAC using the symmetric key and compares it with the received one, throwing an exception if they're not equal.
Param | Description |
---|---|
hmac |
Blob that contains the received hmac |
dataToCheck |
Blob that contains the data to check the hmac for |
Type
void
Description
void
try {
EncryptionRecipes.checkHMACSHA512Recipe(hmac, corruptedData);
} catch(Exception e) {
// Should log exception
System.debug(e.getMessage());
}
Recomputes Digital Signature for and compares it with the received one, throwing an exception if they're not equal.
Param | Description |
---|---|
signature |
Blob that contains the received signature |
dataToCheck |
Blob that contains the data to check the signature for |
Type
void
Description
void
try {
EncryptionRecipes.checkRSASHA512DigitalSignatureRecipe(signature, corruptedData);
} catch(Exception e) {
// Should log exception
System.debug(e.getMessage());
}
Recomputes hash digest for and compares it with the received one, throwing an exception if they're not equal.
Param | Description |
---|---|
hash |
Blob that contains the received hash |
dataToCheck |
Blob that contains the data to check the hash for |
Type
void
Description
void
try {
EncryptionRecipes.checkSHA512HashRecipe(hash, corruptedData);
} catch(Exception e) {
// Should log exception
System.debug(e.getMessage());
}
Encrypts data using AES algorithm, which needs a symmetric key to be shared with the receiver. In this case the sender needs to share the initialization vector with the receiver.
Param | Description |
---|---|
dataToDecrypt |
Blob that contains the data to be decrypted |
Type
Blob
Description
Blob
Blob decryptedData = EncryptionRecipes.decryptAES256Recipe(encryptedData);
System.debug(decryptedData.toString());
Encrypts data using AES algorithm, which needs a symmetric key to be shared with the receiver. In this case the initialization vector will be the first 128 bits (16 bytes) of the received data.
Param | Description |
---|---|
dataToDecrypt |
Blob that contains the data to be decrypted |
Type
Blob
Description
Blob
Blob decryptedData = EncryptionRecipes.decryptAES256WithManagedIVRecipe(encryptedData);
System.debug(decryptedData.toString());
encryptAES256AndGenerateRSASHA512DigitalSignRecipe(Blob dataToEncryptAndSign)
→ EncryptedAndSignedData
Encrypts the message with AES and then generates Digital Signature (encrypted with an asymmetric key) that can be checked in destination. This ensure confidentiality, integrity, authenticity and non-repudiation.
Param | Description |
---|---|
dataToEncryptAndSign |
Blob that contains some data to encrypt and sign |
Type
EncryptedAndSignedData
Description
Blob
Blob dataToEncryptAndSign = Blob.valueOf('Test data');
EncryptedAndSignedData wrapper = EncryptionRecipes.encryptAES256AndGenerateRSASHA512DigitalSignRecipe();
System.debug(EncodingUtil.base64Encode(wrapper.encryptedData));
System.debug(EncodingUtil.base64Encode(wrapper.signature));
Encrypts data using AES algorithm, which needs a symmetric key to be shared with the receiver. In this case the initialization vector is specified by the sender. It needs to be random and 16 bytes (128 bits).
Param | Description |
---|---|
dataToEncrypt |
Blob that contains the data to encrypt |
Type
Blob
Description
Blob
Blob initializationVector = EncryptionRecipes.generateInitializationVector();
Blob dataToEncrypt = Blob.valueOf('Test data');
Blob encryptedData = EncryptionRecipes.encryptAES256Recipe(dataToEncrypt, initializationVector);
System.debug(EncodingUtil.base64Encode(encryptedData));
Encrypts data using AES algorithm, which needs a symmetric key to be shared with the receiver. In this case the initialization vector is managed by Salesforce.
Param | Description |
---|---|
dataToEncrypt |
Blob that contains the data to encrypt |
Type
Blob
Description
Blob
Blob dataToEncrypt = Blob.valueOf('Test data');
Blob encryptedData = EncryptionRecipes.encryptAES256WithManagedIVRecipe(dataToEncrypt);
System.debug(EncodingUtil.base64Encode(encryptedData));
Generates one-way HMAC (using a symmetric key) that can be checked in destination to ensure integrity and authenticity.
Param | Description |
---|---|
dataToHmac |
Blob that contains some data for which to generate an HMAC |
Type
Blob
Description
Blob
Blob dataToHmac = Blob.valueOf('Test data');
Blob hmac = EncryptionRecipes.generateHMACSHA512Recipe();
System.debug(EncodingUtil.base64Encode(hmac));
Aux method to generate a random initialization vector.
Type
Blob
Description
Blob
Generates one-way Digital Signature (encrypted with an asymmetric key) that can be checked in destination to ensure integrity, authenticity and non-repudiation.
Param | Description |
---|---|
dataToSign |
Blob that contains some data to sign |
Type
Blob
Description
Blob
Blob dataToSign = Blob.valueOf('Test data');
Blob signature = EncryptionRecipes.generateRSASHA512DigitalSignatureRecipe();
System.debug(EncodingUtil.base64Encode(signature));
Generates one-way hash digest that can be checked in destination to ensure integrity.
Param | Description |
---|---|
dataToHmac |
Blob that contains some data for which to generate a hash |
Type
Blob
Description
Blob
Blob dataToHash = Blob.valueOf('Test data');
Blob hash = EncryptionRecipes.generateSHA512HashRecipe();
System.debug(EncodingUtil.base64Encode(hash));
Internal custom exception class
Comparisons which involve cryptography need to be performed in constant time using specialized functions to avoid timing attack effects. https://en.wikipedia.org/wiki/Timing_attack
Param | Description |
---|---|
first |
first String to compare |
second |
second String to compare |
Type
boolean
Description
Boolean strings are equal
Decrypts the message and verifies its Digital Signature.
Param | Description |
---|---|
signature |
Blob that contains the received signature |
dataToDecryptAndCheck |
Blob that contains the data to check the signature for |
Type
Blob
Description
Blob decrypted data
try {
EncryptionRecipes.decryptAES256AndCheckRSASHA512DigitalSignRecipe(signature, corruptedData);
} catch(Exception e) {
// Should log exception
System.debug(e.getMessage());
}