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()时出错。
最佳答案
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
代替即可保存:)关于java - 如何使用SHA2验证数据完整性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4757037/