2014-09-03 117 views
1

我是java安全新手,所以對你們來說聽起來很愚蠢。我正在使用三重DES算法進行加密解密,因爲我使用散列值作爲鍵。我正在使用SHA-512進行散列,我聽說兩個相同的字符串哈希將相同,但我得到不同的輸出相同的字符串。我附上sha-512的代碼。如果可能,讓我知道問題是什麼。sha-512爲相同的字符串返回不同的值

public class SHA256Algo { 

    public static String createHash(String text) throws UnsupportedEncodingException, NoSuchAlgorithmException 
    { 
     String encryptedText = "" ; 
     MessageDigest md = MessageDigest.getInstance("SHA-512"); 

     md.update(text.getBytes("UTF-16")); // Change this to "UTF-16" if needed 
     byte[] digest = md.digest(); 
     String str = digest.toString() ; 
     return str ; 
    } 

    public static void main(String[] args) { 
     try { 
      System.out.println(createHash("tarun")) ; 
      System.out.println(createHash("tarun")) ; 
     } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

輸出:
[B @ 32d2bb53
[B @ 29086036

+1

toString()數組沒有你期望的效果。 – Arkadiy 2014-09-03 16:53:38

+0

你可以使用第三方庫嗎?如果你可以使用Guava的'Hashing.sha512()。hashString(text,Charsets.UTF_16).toString()',這將會簡單得多,它將完全實現你想要的。 – 2014-09-03 17:28:21

回答

4

數組是太Java對象,但它們不會覆蓋ObjecttoString()方法。輸出不是散列輸出,而是Object's toString() method的結果。

[T]他的方法返回一個字符串等於的值:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

getClass().getName()負責[B,再有就是@字符,字符的其餘部分是十六進制哈希碼,也從Object

您需要將byte數組轉換爲String,除了撥打toString()之外。這可能涉及將字節數組轉換爲Base 64或十六進制字符。

+0

感謝您的時間,你可以給我一個示例代碼到特定的轉換。 – 2014-09-03 16:59:55

+0

@tarunverma查看Byte和String API的方法,如* parse *或* value *。看看他們的javadoc。如果你[eclipse](http://www.eclipse.org/downloads/index-developer.php)設置[很好](http://superuser.com/questions/167458/how),所有這些應該很容易。 -to-附加的javadocs到蝕)。 – Pureferret 2014-09-03 17:07:07

+0

感謝所有我找到出路將其轉換爲字符串我分享代碼希望它可以幫助其他人... 'byte [] digest = md.digest(); \t \t StringBuffer hexString = new StringBuffer(); (int i = 0; i 2014-09-03 17:15:12

相關問題