Package org.apache.shiro.crypto
Interface CipherService
-
- All Known Implementing Classes:
AbstractSymmetricCipherService,AesCipherService,BlowfishCipherService,DefaultBlockCipherService,JcaCipherService
public interface CipherServiceACipherServiceuses a cryptographic algorithm called a Cipher to convert an original input source using akeyto an uninterpretable format. The resulting encrypted output is only able to be converted back to original form with akeyas well.CipherServices can perform both encryption and decryption.Cipher Basics
For what is known as SymmetricCiphers, theKeyused to encrypt the source is the same as (or trivially similar to) theKeyused to decrypt it. For AsymmetricCiphers, the encryptionKeyis not the same as the decryptionKey. The most common type of Asymmetric Ciphers are based on what is called public/private key pairs: A private key is known only to a single party, and as its name implies, is supposed be kept very private and secure. A public key that is associated with the private key can be disseminated freely to anyone. Then data encrypted by the public key can only be decrypted by the private key and vice versa, but neither party need share their private key with anyone else. By not sharing a private key, you can guarantee no 3rd party can intercept the key and therefore use it to decrypt a message. This asymmetric key technology was created as a more secure alternative to symmetric ciphers that sometimes suffer from man-in-the-middle attacks since, for data shared between two parties, the same Key must also be shared and may be compromised. Note that a symmetric cipher is perfectly fine to use if you just want to encode data in a format no one else can understand and you never give away the key. Shiro uses a symmetric cipher when creating certain HTTP Cookies for example - because it is often undesirable to have user's identity stored in a plain-text cookie, that identity can be converted via a symmetric cipher. Since the the same exact Shiro application will receive the cookie, it can decrypt it via the sameKeyand there is no potential for discovery since that Key is never shared with anyone.
ShiroCipherServices vs JDKCiphersCipherServices essentially do the same things as JDKCiphers, but in simpler and easier-to-use ways for most application developers. When thinking about encrypting and decrypting data in an application, most app developers want what aCipherServiceprovides, rather than having to manage the lower-level intricacies of the JDK'sCipherAPI. Here are a few reasons why most people preferCipherServices:- Stateless Methods -
CipherServicemethod calls do not retain state between method invocations. JDKCipherinstances do retain state across invocations, requiring its end-users to manage the instance and its state themselves. - Thread Safety -
CipherServiceinstances are thread-safe inherently because no state is retained across method invocations. JDKCipherinstances retain state and cannot be used by multiple threads concurrently. - Single Operation -
CipherServicemethod calls are single operation methods: encryption or decryption in their entirety are done as a single method call. This is ideal for the large majority of developer needs where you have something unencrypted and just want it decrypted (or vice versa) in a single method call. In contrast, JDKCipherinstances can support encrypting/decrypting data in chunks over time (because it retains state), but this often introduces API clutter and confusion for most application developers. - Type Safe - There are
CipherServiceimplementations for different Cipher algorithms (AesCipherService,BlowfishCipherService, etc). There is only one JDKCipherclass to represent all cipher algorithms/instances. - Simple Construction - Because
CipherServiceinstances are type-safe, instantiating and using one is often as simple as calling the default constructor, for example,new AesCipherService();. The JDKCipherclass however requires using a procedural factory method with String arguments to indicate how the instance should be created. The String arguments themselves are somewhat cryptic and hard to understand unless you're a security expert. Shiro hides these details from you, but allows you to configure them if you want.
- Since:
- 1.0
- See Also:
BlowfishCipherService,AesCipherService
-
-
Method Summary
All Methods Instance Methods Abstract Methods Modifier and Type Method Description org.apache.shiro.util.ByteSourcedecrypt(byte[] encrypted, byte[] decryptionKey)Decrypts encrypted data via the specified cipher key and returns the original (pre-encrypted) data.voiddecrypt(InputStream in, OutputStream out, byte[] decryptionKey)Receives encrypted data from the givenInputStream, decrypts it, and sends the resulting decrypted data to the givenOutputStream.org.apache.shiro.util.ByteSourceencrypt(byte[] raw, byte[] encryptionKey)Encrypts data via the specified cipher key.voidencrypt(InputStream in, OutputStream out, byte[] encryptionKey)Receives the data from the givenInputStream, encrypts it, and sends the resulting encrypted data to the givenOutputStream.
-
-
-
Method Detail
-
decrypt
org.apache.shiro.util.ByteSource decrypt(byte[] encrypted, byte[] decryptionKey) throws org.apache.shiro.crypto.CryptoExceptionDecrypts encrypted data via the specified cipher key and returns the original (pre-encrypted) data. Note that the key must be in a format understood by the CipherService implementation.- Parameters:
encrypted- the previously encrypted data to decryptdecryptionKey- the cipher key used during decryption.- Returns:
- a byte source representing the original form of the specified encrypted data.
- Throws:
org.apache.shiro.crypto.CryptoException- if there is an error during decryption
-
decrypt
void decrypt(InputStream in, OutputStream out, byte[] decryptionKey) throws org.apache.shiro.crypto.CryptoException
Receives encrypted data from the givenInputStream, decrypts it, and sends the resulting decrypted data to the givenOutputStream. NOTE: This method does NOT flush or close either stream prior to returning - the caller must do so when they are finished with the streams. For example:try { InputStream in = ... OutputStream out = ... cipherService.decrypt(in, out, decryptionKey); } finally { if (in != null) { try { in.close(); } catch (IOException ioe1) { ... log, trigger event, etc } } if (out != null) { try { out.close(); } catch (IOException ioe2) { ... log, trigger event, etc } } }- Parameters:
in- the stream supplying the data to decryptout- the stream to send the decrypted datadecryptionKey- the cipher key to use for decryption- Throws:
org.apache.shiro.crypto.CryptoException- if there is any problem during decryption.
-
encrypt
org.apache.shiro.util.ByteSource encrypt(byte[] raw, byte[] encryptionKey) throws org.apache.shiro.crypto.CryptoExceptionEncrypts data via the specified cipher key. Note that the key must be in a format understood by theCipherServiceimplementation.- Parameters:
raw- the data to encryptencryptionKey- the cipher key used during encryption.- Returns:
- a byte source with the encrypted representation of the specified raw data.
- Throws:
org.apache.shiro.crypto.CryptoException- if there is an error during encryption
-
encrypt
void encrypt(InputStream in, OutputStream out, byte[] encryptionKey) throws org.apache.shiro.crypto.CryptoException
Receives the data from the givenInputStream, encrypts it, and sends the resulting encrypted data to the givenOutputStream. NOTE: This method does NOT flush or close either stream prior to returning - the caller must do so when they are finished with the streams. For example:try { InputStream in = ... OutputStream out = ... cipherService.encrypt(in, out, encryptionKey); } finally { if (in != null) { try { in.close(); } catch (IOException ioe1) { ... log, trigger event, etc } } if (out != null) { try { out.close(); } catch (IOException ioe2) { ... log, trigger event, etc } } }- Parameters:
in- the stream supplying the data to encryptout- the stream to send the encrypted dataencryptionKey- the cipher key to use for encryption- Throws:
org.apache.shiro.crypto.CryptoException- if there is any problem during encryption.
-
-