我最近做一个简单的TCP通信程序,现在要求对传递的信息(也就是字符串)进行SHA-1验证。我找到一个能用的验证类,但是不知道怎么把通信类的字符串用这个SHA-1验证,求大神解救SHA-1验证类
import java.security.*;public class myDigest {    public static void main(String[] args) {
        myDigest my = new myDigest();
        my.testDigest();
    }    public void testDigest() {
        try {
            String myinfo = "abc";
            java.security.MessageDigest alga = java.security.MessageDigest.getInstance("SHA-1");
            alga.update(myinfo.getBytes());
            byte[] digesta = alga.digest();
            System.out.println("本信息摘要是 :" + byte2hex(digesta));
            // 通过某中方式传给其他人你的信息 (myinfo) 和摘要 (digesta) 对方可以判断是否更改或传输正常
            java.security.MessageDigest algb = java.security.MessageDigest.getInstance("SHA-1");
            algb.update(myinfo.getBytes());
            if (MessageDigest.isEqual(digesta, algb.digest())) {
                System.out.println("信息检查正常");
            } else {
                System.out.println("摘要不相同");
            }
        } catch (java.security.NoSuchAlgorithmException ex) {
            System.out.println("非法摘要算法");
        }
    }    public String byte2hex(byte[] b) // 二行制转字符串
    {
        String hs = "";
        String stmp = "";
        for (int n = 0; n < b.length; n++) {
            stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
            if (stmp.length() == 1) {
                hs = hs + "0" + stmp;
            } else {
                hs = hs + stmp;
            }
            if (n < b.length - 1) {
                hs = hs + ":";
            }
        }
        return hs.toUpperCase();
    }
}
我现在就想把这个类改一下,使他可以验证其他类传来的字符串生成SHA-1码再返回给调用它的类

解决方案 »

  1.   

    补充一下,C语言里可以用简单的传参解决这个问题,但是java涉及类以及乱七八糟的规则,很是头疼
      

  2.   

    LZ想生成什么样的SHA-1码,byte类型还是字符串类型?给你改了一下了,LZ自己再根据项目需求修改细节吧
    import java.security.*;public class MyDigest {
        public static void main(String[] args) {
            try {
                String data1 = "abc"; //测试字符串
                String data2 = "abc";
                
                System.out.println(MyDigest.toDigestString(data1, "SHA-1")); //测试字符串的摘要信息
                System.out.println(MyDigest.toDigestString(data2, "SHA-1"));
                System.out.println(MyDigest.isEqual(data1, data2, "SHA-1")); //测试两个字符串的摘要信息是否相同        } catch (Throwable e) {
                e.printStackTrace();
            }
        }    public static MessageDigest getDigest(String algorithm) throws NoSuchAlgorithmException { //获得算法实例
            return MessageDigest.getInstance(algorithm);
        }    public static String toDigestString(String data, String algorithm) throws NoSuchAlgorithmException { //获得摘要信息的String
            return toHexString(toDigest(data, algorithm));
        }    public static byte[] toDigest(String data, String algorithm) throws NoSuchAlgorithmException { //获得字符串摘要信息的byte数组
            MessageDigest digest = getDigest(algorithm);
            digest.update(data.getBytes());
            return digest.digest();
        }    public static boolean isEqual(String data1, String data2, String algorithm) throws NoSuchAlgorithmException { //比较两个字符串的摘要信息是否相同
            MessageDigest digest = getDigest(algorithm);
            digest.update(data1.getBytes());
            byte[] b1 = digest.digest();
            digest.reset();
            digest.update(data2.getBytes());
            return digest.isEqual(digest.digest(), b1);
        }    public static String toHexString(byte[] b) { //byte数组转成字符串
            StringBuilder sb = new StringBuilder();
            for (int i=0; i<b.length; i++) {
                sb.append(String.format("%02X", b[i]));
                if (i < b.length-1) {sb.append(":");}
            }
            return sb.toString();
        }
    }
      

  3.   


    大神是好人啊!!对不起回帖晚了,这几天一直在忙Cisco学校又搞出个这个作业.....
    还有一个问题,java里面可以直接像C一样弄成主函数子函数的形式吗?我试着把原来那个类里面的
    public void testDigest()提取出来
    改成了
    public void testDigest(string str)
    但是不能像C里面那样调用啊,这里面还有什么玄机还请大神指点
      

  4.   

    当然可以有主函数子函数了,你是怎么调用的?
    如果你要返回一个字符串,就不能用void类型,你把你写的贴出来看看,不明白你说的象C里面那样调用?
      

  5.   

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */package client;// file name:ComputeTCPClient.java
    import java.net.*;
    import java.io.*;
    import java.security.*;public class ComputeTCPClient
    {
        public static void main(String srgs[])
        {
          try
          {
            //创建连接特定服务器的指定端口的Socket对象
            Socket socket = new Socket("127.0.0.1", 8000);
            //获得从服务器端来的网络输入流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            //获得从客户端向服务器端输出数据的网络输出流
            PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
            //创建键盘输入流,以便客户端从键盘上输入信息
            BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));
            System.out.print("请输入待发送的数据:");
            String str=stdin.readLine(); //从键盘读入待发送的数据
            string digest;
            digest = testDigest(str);
            out.println(str);  //通过网络传送到服务器
            str=in.readLine();//从网络输入流读取结果
            System.out.println( "从服务器接收到的结果为:"+str); //输出服务器返回的结果
           }
           catch (Exception e)
           {
            System.out.println(e);
           }
         }    public static string testDigest(string myinfo) {
            try {
                //String myinfo = "abc";
                java.security.MessageDigest alga = java.security.MessageDigest.getInstance("SHA-1");
                alga.update(myinfo.getBytes());
                byte[] digesta = alga.digest();
                System.out.println("本信息摘要是 :" + byte2hex(digesta));
                // 通过某中方式传给其他人你的信息 (myinfo) 和摘要 (digesta) 对方可以判断是否更改或传输正常
                java.security.MessageDigest algb = java.security.MessageDigest.getInstance("SHA-1");
                algb.update(myinfo.getBytes());
                if (MessageDigest.isEqual(digesta, algb.digest())) {
                    System.out.println("信息检查正常");
                } else {
                    System.out.println("摘要不相同");
                }
            } catch (java.security.NoSuchAlgorithmException ex) {
                System.out.println("非法摘要算法");
            }
        }    public static String byte2hex(byte[] b) // 二行制转字符串
        {
            String hs = "";
            String stmp = "";
            for (int n = 0; n < b.length; n++) {
                stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
                if (stmp.length() == 1) {
                    hs = hs + "0" + stmp;
                } else {
                    hs = hs + stmp;
                }
                if (n < b.length - 1) {
                    hs = hs + ":";
                }
            }
            return hs.toUpperCase();
        }
    }
    netbeans直接报错啊
      

  6.   

    报了什么错,有没有详细的错误信息?
    首先你的testDigest方法本身没有返回值。
    你要在testDigest方法后面加上return,即在try的最后加上return byte2hex(digesta);在testDigest方法的最后加上return "";
    其次,别人的例子只是为了说明用法而在里面作了一次比较,你没必要把testDigest方法内存的代码全部保留,因为你只是想得到一个摘要信息,得到以后,就可以renturn了,java.security.MessageDigest algb = java.security.MessageDigest.getInstance("SHA-1");以后的代码可以不要了。