您能否建议我使用SHA1算法加密字符串? 我搜索过它。但没有运气。
提前致谢。
答案 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的其余部分还有更多功能。看看吧。
编辑:
如果你得到一个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类已经存在......)
答案 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();
}