@Override
    protected Object getCredentials(AuthenticationInfo info) {
        Object credentials = info.getCredentials();

        byte[] storedBytes = toBytes(credentials);

        if (credentials instanceof String || credentials instanceof char[]) {
            //account.credentials were a char[] or String, so
            //we need to do text decoding first:
            if (isStoredCredentialsHexEncoded()) {
                storedBytes = Hex.decode(storedBytes);
            } else {
                storedBytes = Base64.decode(storedBytes);
            }
        }
        SimpleHash hash = newHashInstance();
        hash.setBytes(storedBytes);
        return hash;
    }
Returns a {@link Hash Hash} instance representing the already-hashed AuthenticationInfo credentials stored in the system.
<p/>
This method reconstructs a {@link Hash Hash} instance based on a {@code info.getCredentials} call,
but it does <em>not</em> hash that value - it is expected that method call will return an already-hashed value.
<p/>
This implementation's reconstruction effort functions as follows:
<ol>
<li>Convert {@code account.getCredentials()} to a byte array via the {@link #toBytes toBytes} method.
<li>If {@code account.getCredentials()} was originally a String or char[] before {@code toBytes} was
called, check for encoding:
<li>If {@link #storedCredentialsHexEncoded storedCredentialsHexEncoded}, Hex decode that byte array, otherwise
Base64 decode the byte array</li>
<li>Set the byte[] array directly on the {@code Hash} implementation and return it.</li>
</ol>

@param info the AuthenticationInfo from which to retrieve the credentials which assumed to be in already-hashed form.
@return a {@link Hash Hash} instance representing the given AuthenticationInfo's stored credentials.
core/src/main/java/org/apache/shiro/authc/credential/HashedCredentialsMatcher.java