1
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

4 回答 4

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()方法返回一个数组本身。赋值运算符永远不会将结果写入现有数组。当然,除非您指定索引。

还有一件事。调用时我不会使用 text.length() ,update(..)因为它不一定与结果字节数组的长度相同。这主要是多字节字符编码(如 UTF-8)的情况。它也可能发生在无法映射的字符上,具体取决于您选择的策略。好吧,重点是:你不需要知道我在说什么。只需使用数组.length来保存:)

于 2011-01-21T09:21:29.160 回答
2

您需要指定要使用的SHA-2变体:SHA-256 或 SHA-512。使用这些作为摘要名称。

于 2011-01-21T09:20:24.553 回答
2

如果您还没有,我建议您阅读JCA 上的 SUN 文档,尤其是MessageDigest。如果您查看默认的SUN 提供程序,您会注意到 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());
于 2011-01-21T09:26:23.140 回答
1

什么错误?“无法解析sha1hash”?您错过了声明变量。在 eclipse 中按 ctrl-1 就可以了。sha2hash呢?我会说,应该只有一个这样的变量。文本和文本字符串呢?另一个自我困惑?

顺便说一句,没有“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();
}
于 2011-01-21T09:21:42.583 回答