Jsp SHA1返回不同的摘要

Jsp SHA1返回不同的摘要,jsp,hash,sha1,Jsp,Hash,Sha1,您只是打印出字节[]。toString不是散列的内容 import java.security.MessageDigest; class Enc{ public String encryptPassword(String password) throws Exception{ byte[] bArray=password.getBytes(); MessageDigest m

您只是打印出
字节[]。toString
不是散列的内容

    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
*/
要将散列显示为文本,您应该将字节数组转换为十六进制或base64-堆栈溢出上有大量代码段可以实现这一点(例如,使用)。如果不需要哈希作为文本,可以将其保留为字节数组

还请注意,不应使用以下代码:

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

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

这里是一个代码片段I到MD5,包含整个文件。当我MD5ed一个我想发送的文件,看看他们的客户端是否已经有了相同的文件时,它对我起到了作用。如果需要,可以找到完整的源代码

私有静态字符串getMD5Digest(文件){
BufferedInputStream读取器=空;
字符串hexDigest=新字符串();
试一试{
reader=new BufferedInputStream(new FileInputStream(file));
}catch(filenotfounde异常){
e、 printStackTrace();
}
MessageDigest md=null;
试一试{
md=MessageDigest.getInstance(“MD5”);
}捕获(无算法异常){
e、 printStackTrace();
}
字节[]缓冲区=新字节[4096];
long fileLength=file.length();
long bytesLeft=文件长度;
int read=0;
//将文件读入md缓冲区
while(字节左>0){
试一试{
read=reader.read(buffer,0,bytesLeft
read
调用返回-1之前,您为什么要费心使用文件长度而不仅仅是读取?另外,为什么要创建一个新的空字符串而不是使用“”?另外,如果有IOException,你继续,好像什么都没发生。。。如果有未经检查的异常,您将使读取器处于打开状态。。。(应该使用finally块)我从来没有说过这是一个好代码。我说是代码起了作用:)读取bytesLeft>0更具确定性。它可能会捕获/dev/zero的边缘情况,但我没有尝试。String.new和“”在Ruby中是相等的,我认为Java中也是如此。在服务器/客户机上,这些调用被包装在一个try-catch中,如果调用正确,它将清理套接字。是的,这不是最好的代码。不,“,”和
new String()
在Java中是不一样的-后者总是创建一个新对象,前者不一样。(通常最好还是使用StringBuilder。)不管套接字如何,由于缺少finally块,上述代码中的文件句柄可能会泄漏,而且事实上,它只是在出错时停止,而不是向调用方指示出错,这是非常糟糕的,依我看(我会让该方法抛出IOException)很高兴知道在“”vs new String()上,那么我的一半函数都必须有throws语句才能将其抛出调用堆栈,即使它们只是抛出捕获的内容。是的,如果在运行时拔下U盘,文件句柄可能会泄漏。如果你感到不安,我很乐意接受这个项目的补丁:)我想是这样的,因为eclipse自动完成了这个块,而我离开了它。也许帮助太多的工具是危险的。你一开始就不必费心捕捉异常——只要让调用方知道它就行了。如果您很少实际捕获异常,那么代码就会变得更小——这往往是正确的做法,因为您很少能够真正处理错误情况并成功继续。
byte[] bArray=password.getBytes()
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;
}