2011-04-22 34 views
4

你可以建議我如何使用SHA1算法加密字符串? 我搜索了它。但沒有運氣。在Android上進行SHA1加密?

在此先感謝。

+6

SHA1不是加密算法,它是散列算法。一旦你散佈了你的消息,就不可能「消散」它。就這樣你知道。更多信息在這裏:http://en.wikipedia.org/wiki/Hash_algorithm。 – Darhuuk 2011-04-22 15:37:25

+0

恕我直言,這是不夠的簡單散列一次字符串。考慮用隨機種子醃製字符串,並「遞歸」地將鹽醃的字符串散列至少1000次。您將需要存儲隨機種子。 – JAL 2011-04-22 19:40:23

+0

更簡單的SHA-1方法:(根據評論者的建議更新,也使用更高效的字節 - >字符串算法)請參閱此鏈接http://stackoverflow.com/questions/5980658/how-to-sha1-hash- a-string-in-android – 2015-06-03 06:45:20

回答

2

這裏有2種方法,同時尋找一個SHA1算法實現我發現:

private static String convertToHex(byte[] data) { 
    StringBuffer buf = new StringBuffer(); 
    int length = data.length; 
    for(int i = 0; i < length; ++i) { 
     int halfbyte = (data[i] >>> 4) & 0x0F; 
     int two_halfs = 0; 
     do { 
      if((0 <= halfbyte) && (halfbyte <= 9)) 
       buf.append((char) ('0' + halfbyte)); 
      else 
       buf.append((char) ('a' + (halfbyte - 10))); 
      halfbyte = data[i] & 0x0F; 
     } 
     while(++two_halfs < 1); 
    } 
    return buf.toString(); 
} 

public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    byte[] sha1hash = new byte[40]; 
    md.update(text.getBytes("iso-8859-1"), 0, text.length()); 
    sha1hash = md.digest(); 
    return convertToHex(sha1hash); 
} 

使用SHA1方法,讓您的SHA1字符串。我還沒有確認這確實是一個sha1,但它適用於我的應用程序。

+0

太棒了!人。謝謝! – Ferdinand 2011-04-22 15:39:39

+0

你的縮進看起來有點不一致,所以我更加一致。如果你不喜歡它,只需回滾。 :) – alternative 2011-04-22 15:42:05

+1

還要記住,byte []是一個更緊湊的格式,然後是一個十六進制字符串,因此在將數據呈現給用戶之前,它可能更有效地將其存儲爲字節[],在這種情況下,用戶期望十六進制。 – alternative 2011-04-22 15:43:22

9

binnyb's convertToHex方法無法正常工作。更正確的一個,對我的工作原理是:

private static String convertToHex(byte[] data) { 
    StringBuffer buf = new StringBuffer(); 
    for (int i = 0; i < data.length; i++) { 
     int halfbyte = (data[i] >>> 4) & 0x0F; 
     int two_halfs = 0; 
     do { 
      if ((0 <= halfbyte) && (halfbyte <= 9)) { 
       buf.append((char) ('0' + halfbyte)); 
      } 
      else { 
       buf.append((char) ('a' + (halfbyte - 10))); 
      } 
      halfbyte = data[i] & 0x0F; 
     } while(two_halfs++ < 1); 
    } 
    return buf.toString(); 
} 


public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException { 
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    byte[] sha1hash = new byte[40]; 
    md.update(text.getBytes("iso-8859-1"), 0, text.length()); 
    sha1hash = md.digest(); 
    return convertToHex(sha1hash); 
} 

使用SHA1方法,讓您的SHA1字符串。

更新:提供一個完整的答案

+0

你簡直太棒了 – Jigar 2015-04-07 04:42:41

0

binnyb設置我在正確的軌道上,但是我發現更多一些,更容易理解代碼在這裏: http://www.coderanch.com/t/526487/java/java/Java-Byte-Hex-String

private static String convertToHex(byte[] data) { 
    StringBuilder sb = new StringBuilder(data.length * 2); 

    Formatter fmt = new Formatter(sb); 
    for (byte b : data) { 
     fmt.format("%02x", b); 
    } 

    return sb.toString(); 
} 
2

我以前回答過這個( How to SHA1 hash a string in Android?),但它也適用於此:

Android自帶Apache的Commons Codec,因此您可以簡單地使用以下行創建一個SHA-1格式的字符串:

String myHexHash = DigestUtils.shaHex(myFancyInput); 

這是您默認使用Android 4的舊的棄用方法。新版本的DigestUtils帶來了所有shaHex()方法的風格,如sha256Hex(),並且還用不同的參數類型重載了方法。

當然,DigestUtils和Commons Codec的其餘部分還有更多的功能。看一看。

http://commons.apache.org/proper/commons-codec//javadocs/api-release/org/apache/commons/codec/digest/DigestUtils.html

編輯:

如果你得到一個ClassNotFoundError你必須明確地添加公地編解碼器的依賴性(即使它應該有Android作爲傳遞依賴),在Maven的如:

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

而且也,你將不得不調用更改爲:

String myHexHash = new String(Hex.encodeHex(DigestUtils.sha512(myFancyInput))); 

(我的簡單猜測是,這可能是由於Android VM中的ClassLoader問題(類名衝突) - 這實際上證明了commons-codec類已經存在......)

另見: https://stackoverflow.com/a/9284092/621690