Шифрование SHA не работает

Ниже приведен код, который я написал для шифрования SHA. Но компиляция этого дает исключение

java.security.NoSuchAlgorithmException: SHA SecretKeyFactory недоступен

Пожалуйста, помогите решить эту проблему? На самом деле я не знаком с методами шифрования.

Код :

public String encrypt(String password)
    {
        try
        {

            KeySpec ks=new PBEKeySpec(password.toCharArray());
            SecretKeyFactory skf=SecretKeyFactory.getInstance(algo);
            SecretKey key=skf.generateSecret(ks);
            MessageDigest md=MessageDigest.getInstance("SHA-256");
            md.update(password.getBytes());
            byte[] digest=md.digest();
            byte[] salt=Arrays.copyOf(digest, 16);
            AlgorithmParameterSpec aps=new PBEParameterSpec(salt, 20);
            Cipher cipher=Cipher.getInstance(algo);
            cipher.init(Cipher.ENCRYPT_MODE, key, aps);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return password;
    }

    @Override
    public String decrypt(String password)
    {
        try
        {
            KeySpec ks=new PBEKeySpec(password.toCharArray());
            SecretKeyFactory skf=SecretKeyFactory.getInstance(algo);
            SecretKey key=skf.generateSecret(ks);
            MessageDigest md=MessageDigest.getInstance("SHA-256");
            md.update(password.getBytes());
            byte[] digest=md.digest();
            byte[] salt=Arrays.copyOf(digest, 16);
            AlgorithmParameterSpec aps=new PBEParameterSpec(salt, 20);
            Cipher cipher=Cipher.getInstance(algo);
            cipher.init(Cipher.DECRYPT_MODE, key, aps);

        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        return password;
    }

person Gapchoos    schedule 01.05.2013    source источник
comment
SHA-2 не является шифрованием. Это хэш, и поэтому не предлагает эффективной обратной операции.   -  person CodesInChaos    schedule 01.05.2013
comment
Итак, есть ли другой способ зашифровать строку с помощью SHA и расшифровать то же самое?   -  person Gapchoos    schedule 01.05.2013
comment
Можете ли вы описать, что ваш код должен делать? Это имеет очень мало смысла. Имена переменных предполагают, что вы хотите хешировать пароль, который полностью отличается от шифрования. Вы должны описать свою реальную проблему, а не оставшуюся проблему после неправильного решения первой половины проблемы.   -  person CodesInChaos    schedule 01.05.2013
comment
где определена переменная algo в вашем коде?   -  person Peter Elliott    schedule 01.05.2013
comment
@PeterElliott статический алгоритм String = SHA-256;   -  person Gapchoos    schedule 02.05.2013


Ответы (1)


Если вы не хотите тратить время на изобретение велосипеда, вы всегда можете выбрать org.apache.commons. В частности, вот как это сделать:

String hash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password);

Добавьте это в свой POM, и все готово:

<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.7</version>
</dependency> 

Это провал: MessageDigest.getInstance("SHA-256");. Нет доступной реализации хеширования SHA256 по умолчанию. Кроме того, как вы планируете decrypt SHA2? Может быть, я не понимаю вашего намерения, но алгоритмы хэширования задуманы как необратимые.

Шифрование

AFAIK лучший алгоритм шифрования (не хеширования/обратимости) - это AES. Вот хороший ответ о том, как использовать AES.

Шифровать и расшифровывать с помощью кодировки AES и Base64

person flavian    schedule 01.05.2013