在Android上进行SHA1加密?

时间:2011-04-22 15:33:17

标签: java android encryption sha1

您能否建议我使用SHA1算法加密字符串? 我搜索过它。但没有运气。

提前致谢。

4 个答案:

答案 0 :(得分:9)

binnyb的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字符串。

更新:提供完整的答案

答案 1 :(得分: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,但它适用于我的应用程序。

答案 2 :(得分:2)

我之前已经回答了这个问题(How to SHA1 hash a string in Android?),但它也适用于此:

Android附带Apache的Commons Codec,因此您只需使用以下行创建SHA-1 hexed String:

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,你必须在Maven中显式地添加commons-codec作为依赖项(即使它应该与Android一起作为传递依赖),例如:

    <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

答案 3 :(得分: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();
}