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/

10-12 01:34