-3

下面是我为 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;
    }
4

1 回答 1

3

如果您不想浪费时间重新发明轮子,您可以随时选择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 散列的默认实现。另外,您打算如何进行decryptSHA2?也许我无法理解您的意图,但哈希算法在设计上是不可逆转的。

加密

AFAIK 最好的加密(非散列/可逆)算法是 AES。这是关于如何使用 AES 的一个很好的答案。

使用 AES 和 Base64 编码进行加密和解密

于 2013-05-01T12:00:42.293 回答