Package org.apache.shiro.crypto.hash
Class SimpleHash
- java.lang.Object
-
- org.apache.shiro.codec.CodecSupport
-
- org.apache.shiro.crypto.hash.AbstractHash
-
- org.apache.shiro.crypto.hash.SimpleHash
-
- All Implemented Interfaces:
Serializable
,Hash
,org.apache.shiro.util.ByteSource
- Direct Known Subclasses:
Md2Hash
,Md5Hash
,Sha1Hash
,Sha256Hash
,Sha384Hash
,Sha512Hash
public class SimpleHash extends AbstractHash
AHash
implementation that allows anyMessageDigest
algorithm name to be used. This class is a less type-safe variant than the otherAbstractHash
subclasses (e.g.Sha512Hash
, etc), but it does allow for any algorithm name to be specified in case the other subclass implementations do not represent an algorithm that you may want to use. As of Shiro 1.1, this class effectively replaces the (now-deprecated)AbstractHash
class. It subclassesAbstractHash
only to retain backwards-compatibility.- Since:
- 1.1
- See Also:
- Serialized Form
-
-
Constructor Summary
Constructors Constructor Description SimpleHash(String algorithmName)
Creates an new instance with only itsalgorithmName
set - no hashing is performed.SimpleHash(String algorithmName, Object source)
Creates analgorithmName
-specific hash of the specifiedsource
with nosalt
using a single hash iteration.SimpleHash(String algorithmName, Object source, Object salt)
Creates analgorithmName
-specific hash of the specifiedsource
using the givensalt
using a single hash iteration.SimpleHash(String algorithmName, Object source, Object salt, int hashIterations)
Creates analgorithmName
-specific hash of the specifiedsource
using the givensalt
a total ofhashIterations
times.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected org.apache.shiro.util.ByteSource
convertSaltToBytes(Object salt)
Acquires the specifiedsalt
argument's bytes and returns them in the form of aByteSource
instance.protected org.apache.shiro.util.ByteSource
convertSourceToBytes(Object source)
Acquires the specifiedsource
argument's bytes and returns them in the form of aByteSource
instance.boolean
equals(Object o)
Returnstrue
if the specified object is a Hash and itsbyte array
is identical to this Hash's byte array,false
otherwise.String
getAlgorithmName()
Returns theMessageDigest
algorithm name to use when performing the hash.byte[]
getBytes()
protected MessageDigest
getDigest(String algorithmName)
Returns the JDK MessageDigest instance to use for executing the hash.int
getIterations()
Returns the number of hash iterations used to compute the hash.org.apache.shiro.util.ByteSource
getSalt()
Returns a salt used to compute the hash ornull
if no salt was used.protected byte[]
hash(byte[] bytes)
Hashes the specified byte array without a salt for a single iteration.protected byte[]
hash(byte[] bytes, byte[] salt)
Hashes the specified byte array using the givensalt
for a single iteration.protected byte[]
hash(byte[] bytes, byte[] salt, int hashIterations)
Hashes the specified byte array using the givensalt
for the specified number of iterations.int
hashCode()
Simply returns toHex().hashCode();boolean
isEmpty()
void
setBytes(byte[] alreadyHashedBytes)
Sets the raw bytes stored by this hash instance.void
setIterations(int iterations)
Sets the iterations used to previously compute AN ALREADY GENERATED HASH.void
setSalt(org.apache.shiro.util.ByteSource salt)
Sets the salt used to previously compute AN ALREADY GENERATED HASH.String
toBase64()
Returns a Base64-encoded string of the underlyingbyte array
.protected org.apache.shiro.util.ByteSource
toByteSource(Object o)
Converts a given object into aByteSource
instance.String
toHex()
Returns a hex-encoded string of the underlyingbyte array
.String
toString()
Simple implementation that merely returnstoHex()
.
-
-
-
Constructor Detail
-
SimpleHash
public SimpleHash(String algorithmName)
Creates an new instance with only itsalgorithmName
set - no hashing is performed. Because all other constructors in this class hash thesource
constructor argument, this constructor is useful in scenarios when you have a byte array that you know is already hashed and just want to set the bytes in their raw form directly on an instance. After using this constructor, you can then immediately callsetBytes
to have a fully-initialized instance. N.B.The algorithm identified by thealgorithmName
parameter must be available on the JVM. If it is not, aUnknownAlgorithmException
will be thrown when the hash is performed (not at instantiation).- Parameters:
algorithmName
- theMessageDigest
algorithm name to use when performing the hash.- See Also:
UnknownAlgorithmException
-
SimpleHash
public SimpleHash(String algorithmName, Object source) throws org.apache.shiro.codec.CodecException, org.apache.shiro.crypto.UnknownAlgorithmException
Creates analgorithmName
-specific hash of the specifiedsource
with nosalt
using a single hash iteration. This is a convenience constructor that merely executesthis( algorithmName, source, null, 1);
. Please see theSimpleHashHash(algorithmName, Object,Object,int)
constructor for the types of Objects that may be passed into this constructor, as well as how to support further types.- Parameters:
algorithmName
- theMessageDigest
algorithm name to use when performing the hash.source
- the object to be hashed.- Throws:
org.apache.shiro.codec.CodecException
- if the specifiedsource
cannot be converted into a byte array (byte[]).org.apache.shiro.crypto.UnknownAlgorithmException
- if thealgorithmName
is not available.
-
SimpleHash
public SimpleHash(String algorithmName, Object source, Object salt) throws org.apache.shiro.codec.CodecException, org.apache.shiro.crypto.UnknownAlgorithmException
Creates analgorithmName
-specific hash of the specifiedsource
using the givensalt
using a single hash iteration. It is a convenience constructor that merely executesthis( algorithmName, source, salt, 1);
. Please see theSimpleHashHash(algorithmName, Object,Object,int)
constructor for the types of Objects that may be passed into this constructor, as well as how to support further types.- Parameters:
algorithmName
- theMessageDigest
algorithm name to use when performing the hash.source
- the source object to be hashed.salt
- the salt to use for the hash- Throws:
org.apache.shiro.codec.CodecException
- if either constructor argument cannot be converted into a byte array.org.apache.shiro.crypto.UnknownAlgorithmException
- if thealgorithmName
is not available.
-
SimpleHash
public SimpleHash(String algorithmName, Object source, Object salt, int hashIterations) throws org.apache.shiro.codec.CodecException, org.apache.shiro.crypto.UnknownAlgorithmException
Creates analgorithmName
-specific hash of the specifiedsource
using the givensalt
a total ofhashIterations
times. By default, this class only supports Object method arguments of typebyte[]
,char[]
,String
,File
,InputStream
orByteSource
. If either argument is anything other than these types aCodecException
will be thrown. If you want to be able to hash other object types, or use other salt types, you need to override thetoBytes(Object)
method to support those specific types. Your other option is to convert your arguments to one of the default supported types first before passing them in to this constructor}.- Parameters:
algorithmName
- theMessageDigest
algorithm name to use when performing the hash.source
- the source object to be hashed.salt
- the salt to use for the hashhashIterations
- the number of times thesource
argument hashed for attack resiliency.- Throws:
org.apache.shiro.codec.CodecException
- if either Object constructor argument cannot be converted into a byte array.org.apache.shiro.crypto.UnknownAlgorithmException
- if thealgorithmName
is not available.
-
-
Method Detail
-
convertSourceToBytes
protected org.apache.shiro.util.ByteSource convertSourceToBytes(Object source)
Acquires the specifiedsource
argument's bytes and returns them in the form of aByteSource
instance. This implementation merely delegates to the conveniencetoByteSource(Object)
method for generic conversion. Can be overridden by subclasses for source-specific conversion.- Parameters:
source
- the source object to be hashed.- Returns:
- the source's bytes in the form of a
ByteSource
instance. - Since:
- 1.2
-
convertSaltToBytes
protected org.apache.shiro.util.ByteSource convertSaltToBytes(Object salt)
Acquires the specifiedsalt
argument's bytes and returns them in the form of aByteSource
instance. This implementation merely delegates to the conveniencetoByteSource(Object)
method for generic conversion. Can be overridden by subclasses for salt-specific conversion.- Parameters:
salt
- the salt to be use for the hash.- Returns:
- the salt's bytes in the form of a
ByteSource
instance. - Since:
- 1.2
-
toByteSource
protected org.apache.shiro.util.ByteSource toByteSource(Object o)
Converts a given object into aByteSource
instance. Assumes the object can be converted to bytes.- Parameters:
o
- the Object to convert into aByteSource
instance.- Returns:
- the
ByteSource
representation of the specified object's bytes. - Since:
- 1.2
-
getAlgorithmName
public String getAlgorithmName()
Returns theMessageDigest
algorithm name to use when performing the hash.- Specified by:
getAlgorithmName
in interfaceHash
- Specified by:
getAlgorithmName
in classAbstractHash
- Returns:
- the
MessageDigest
algorithm name to use when performing the hash.
-
getSalt
public org.apache.shiro.util.ByteSource getSalt()
Description copied from interface:Hash
Returns a salt used to compute the hash ornull
if no salt was used.- Returns:
- a salt used to compute the hash or
null
if no salt was used.
-
getIterations
public int getIterations()
Description copied from interface:Hash
Returns the number of hash iterations used to compute the hash.- Returns:
- the number of hash iterations used to compute the hash.
-
getBytes
public byte[] getBytes()
- Specified by:
getBytes
in interfaceorg.apache.shiro.util.ByteSource
- Overrides:
getBytes
in classAbstractHash
-
setBytes
public void setBytes(byte[] alreadyHashedBytes)
Sets the raw bytes stored by this hash instance. The bytes are kept in raw form - they will not be hashed/changed. This is primarily a utility method for constructing a Hash instance when the hashed value is already known.- Overrides:
setBytes
in classAbstractHash
- Parameters:
alreadyHashedBytes
- the raw already-hashed bytes to store in this instance.
-
setIterations
public void setIterations(int iterations)
Sets the iterations used to previously compute AN ALREADY GENERATED HASH. This is provided ONLY to reconstitute an already-created Hash instance. It should ONLY ever be invoked when re-constructing a hash instance from an already-hashed value.- Parameters:
iterations
- the number of hash iterations used to previously create the hash/digest.- Since:
- 1.2
-
setSalt
public void setSalt(org.apache.shiro.util.ByteSource salt)
Sets the salt used to previously compute AN ALREADY GENERATED HASH. This is provided ONLY to reconstitute a Hash instance that has already been computed. It should ONLY ever be invoked when re-constructing a hash instance from an already-hashed value.- Parameters:
salt
- the salt used to previously create the hash/digest.- Since:
- 1.2
-
getDigest
protected MessageDigest getDigest(String algorithmName) throws org.apache.shiro.crypto.UnknownAlgorithmException
Returns the JDK MessageDigest instance to use for executing the hash.- Overrides:
getDigest
in classAbstractHash
- Parameters:
algorithmName
- the algorithm to use for the hash, provided by subclasses.- Returns:
- the MessageDigest object for the specified
algorithm
. - Throws:
org.apache.shiro.crypto.UnknownAlgorithmException
- if the specified algorithm name is not available.
-
hash
protected byte[] hash(byte[] bytes) throws org.apache.shiro.crypto.UnknownAlgorithmException
Hashes the specified byte array without a salt for a single iteration.- Overrides:
hash
in classAbstractHash
- Parameters:
bytes
- the bytes to hash.- Returns:
- the hashed bytes.
- Throws:
org.apache.shiro.crypto.UnknownAlgorithmException
- if the configuredalgorithmName
is not available.
-
hash
protected byte[] hash(byte[] bytes, byte[] salt) throws org.apache.shiro.crypto.UnknownAlgorithmException
Hashes the specified byte array using the givensalt
for a single iteration.- Overrides:
hash
in classAbstractHash
- Parameters:
bytes
- the bytes to hashsalt
- the salt to use for the initial hash- Returns:
- the hashed bytes
- Throws:
org.apache.shiro.crypto.UnknownAlgorithmException
- if the configuredalgorithmName
is not available.
-
hash
protected byte[] hash(byte[] bytes, byte[] salt, int hashIterations) throws org.apache.shiro.crypto.UnknownAlgorithmException
Hashes the specified byte array using the givensalt
for the specified number of iterations.- Overrides:
hash
in classAbstractHash
- Parameters:
bytes
- the bytes to hashsalt
- the salt to use for the initial hashhashIterations
- the number of times the thebytes
will be hashed (for attack resiliency).- Returns:
- the hashed bytes.
- Throws:
org.apache.shiro.crypto.UnknownAlgorithmException
- if thealgorithmName
is not available.
-
isEmpty
public boolean isEmpty()
-
toHex
public String toHex()
Returns a hex-encoded string of the underlyingbyte array
. This implementation caches the resulting hex string so multiple calls to this method remain efficient. However, callingsetBytes
will null the cached value, forcing it to be recalculated the next time this method is called.- Specified by:
toHex
in interfaceorg.apache.shiro.util.ByteSource
- Overrides:
toHex
in classAbstractHash
- Returns:
- a hex-encoded string of the underlying
byte array
.
-
toBase64
public String toBase64()
Returns a Base64-encoded string of the underlyingbyte array
. This implementation caches the resulting Base64 string so multiple calls to this method remain efficient. However, callingsetBytes
will null the cached value, forcing it to be recalculated the next time this method is called.- Specified by:
toBase64
in interfaceorg.apache.shiro.util.ByteSource
- Overrides:
toBase64
in classAbstractHash
- Returns:
- a Base64-encoded string of the underlying
byte array
.
-
toString
public String toString()
Simple implementation that merely returnstoHex()
.- Overrides:
toString
in classAbstractHash
- Returns:
- the
toHex()
value.
-
equals
public boolean equals(Object o)
Returnstrue
if the specified object is a Hash and itsbyte array
is identical to this Hash's byte array,false
otherwise.- Overrides:
equals
in classAbstractHash
- Parameters:
o
- the object (Hash) to check for equality.- Returns:
true
if the specified object is a Hash and itsbyte array
is identical to this Hash's byte array,false
otherwise.
-
hashCode
public int hashCode()
Simply returns toHex().hashCode();- Overrides:
hashCode
in classAbstractHash
- Returns:
- toHex().hashCode()
-
-