package abc.xyz;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA2{
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 SHA2(String text)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest mesd;
mesd = MessageDigest.getInstance("SHA-2");
byte[] sha2hash = new byte[40];
mesd.update(text.getBytes("iso-8859-1"), 0, text.length());
sha2hash = mesd.digest();//error
return convertToHex(sha2hash);
} }
我在实现digest();
时遇到错误答案 0 :(得分:4)
SHA-2本身不是算法。维基百科:
SHA-2是一组加密哈希函数(SHA-224,SHA-256,SHA-384,SHA-512)
我认为除了SHA-224之外的所有东西都应该可用。
public static String SHA2(String text)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest mesd = MessageDigest.getInstance("SHA-256");
byte[] bytes = text.getBytes("iso-8859-1");
mesd.update(bytes, 0, bytes.length);
byte[] sha2hash = mesd.digest();
return convertToHex(sha2hash);
}
此外,您创建的字节数组不是必需的。 digest()
方法返回一个数组本身。赋值运算符永远不会将结果写入现有数组。除非你指定一个索引。
还有一件事。调用update(..)
时我不会使用text.length(),因为它不一定与结果字节数组的长度相同。这主要是UTF-8等多字节字符编码的情况。对于无法映射的字符,也可能会出现这种情况,具体取决于您选择的策略。嗯,重点是:你不需要知道我在说什么。只需使用数组.length
代替保存:)
答案 1 :(得分:2)
您需要指定要使用的SHA-2变体:SHA-256或SHA-512。将它们用作摘要名称。
答案 2 :(得分:2)
如果您还没有我建议您阅读SUN docs on JCA,尤其是MessageDigest。如果你看一下默认的SUN providers,你会注意到SHA-2实际上并不存在,也许会尝试使用'SHA-512'。
尝试:
String message = "Some Message";
MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");
messageDigest.update(message.getBytes("UTF-16BE"));
byte[] digest = messageDigest.digest();
StringBuffer digestInHex = new StringBuffer();
for (int i = 0, l = digest.length; i < l; i++) {
// Preserve the bit representation when casting to integer.
int intRep = digest[i] & 0xFF;
// Add leading zero if value is less than 0x10.
if (intRep < 0x10) digestInHex.append('\u0030');
// Convert value to hex.
digestInHex.append(Integer.toHexString(intRep));
}
System.out.println(digestInHex.toString());
答案 3 :(得分:1)
什么错误? “sha1hash无法解决”?您错过了声明变量。在eclipse中按ctrl-1可以完成这项工作。 sha2hash怎么样?我会说,应该只有一个这样的变量。那么text和textstring怎么样?另一种自我混淆?
顺便说一下,没有“SHA-2”这样的东西。它是一系列功能,包含例如SHA-256。所以尝试这样的事情:
public static byte[] sha2(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
final MessageDigest mesd = MessageDigest.getInstance("SHA-256");
mesd.update(text.getBytes("iso-8859-1"), 0, text.length());
return mesd.digest();
}