2013-05-01 74 views
-2

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

SHA-2没有加密。这是一个散列,因此不提供有效的逆操作。 – CodesInChaos 2013-05-01 12:02:25

+0

那么有什么其他的方式来使用SHA和decrpyt加密一个字符串 – Gapchoos 2013-05-01 12:03:19

+3

你能描述一下你的代码应该做什么吗?这没什么意义。变量名称表明你想散列一个与加密完全不同的密码。你应该描述你真正的问题,而不是以错误的方式解决问题的前半部分后的剩余问题。 – CodesInChaos 2013-05-01 12:03:31

回答

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哈希可用的默认实现。另外,你打算如何计划decrypt SHA2?也许我不明白你的意图,但散列算法是设计不可逆转的。

加密

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

Encrypt and decrypt with AES and Base64 encoding