SHA1返回不同的摘要

时间:2011-08-29 07:12:23

标签: jsp hash sha1

    import java.security.MessageDigest;
    class Enc{

            public String encryptPassword(String password) throws Exception{
                    byte[] bArray=password.getBytes();
                    MessageDigest md=MessageDigest.getInstance("SHA-1");
                    md.reset();
                    md.update(bArray);
                    byte[] encoded=md.digest();
                    System.out.println(encoded.toString());

                    return "";
            }
            public static void main(String args[]){
                    try{
                    Enc e=new Enc();
                    e.encryptPassword("secret");
                    }catch(Exception e){e.printStackTrace();}
            }
    }

/*

jabira-whosechild-lm.local 12:40:35 % while (true); do java Enc; done 
[B@77df38fd
[B@77df38fd
[B@60072ffb
[B@77df38fd
[B@6016a786
[B@60072ffb
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@6016a786
[B@6f507fb2
[B@77df38fd
[B@6016a786
[B@77df38fd
[B@77df38fd
[B@6016a786
*/

2 个答案:

答案 0 :(得分:3)

您只是打印出byte[].toString,而不是哈希的内容

System.out.println(encoded.toString());

要将散列显示为文本,您应该将字节数组转换为十六进制或base64 - Stack Overflow上有大量的片段来实现(例如使用Apache Commons Codec)。如果您不需要将哈希作为文本,则可以将其保留为字节数组。

另请注意,您不应使用此代码:

byte[] bArray=password.getBytes()

这将使用系统默认字符编码,该编码因系统而异,并且可能无法对所有Unicode进行编码。使用固定编码,例如UTF-8,无论系统默认值如何,它都会为相同的输入提供相同的结果,并且可以编码所有Unicode。

答案 1 :(得分:0)

以下是我对MD5整个文件的代码段。当我向MD5发送我想要发送的文件以查看他们的客户端是否已经拥有相同的文件时,它对我有用。如果需要,可以找到完整的来源here on Github

private static String getMD5Digest(File file) {
    BufferedInputStream reader = null;
    String hexDigest = new String();
    try {
        reader = new BufferedInputStream( new FileInputStream(file));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    byte[] buffer = new byte[4096];
    long fileLength = file.length();
    long bytesLeft = fileLength;
    int  read = 0;
    //Read our file into the md buffer
    while(bytesLeft > 0){
        try {
            read = reader.read(buffer,0, bytesLeft < buffer.length ? (int)bytesLeft : buffer.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        md.update(buffer,0,read);
        bytesLeft -= read;
    }
    byte[] digest = md.digest();
    for (int i = 0; i < digest.length;i++) {
        hexDigest += String.format("%02x" ,0xFF & digest[i]);
    }
    try {
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return hexDigest;
}