如何使用SHA2验证数据完整性?

时间:2011-01-21 09:05:41

标签: java data-integrity sha2

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();

时遇到错误

4 个答案:

答案 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();
}