我最近做一个简单的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码再返回给调用它的类
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码再返回给调用它的类
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();
}
}
大神是好人啊!!对不起回帖晚了,这几天一直在忙Cisco学校又搞出个这个作业.....
还有一个问题,java里面可以直接像C一样弄成主函数子函数的形式吗?我试着把原来那个类里面的
public void testDigest()提取出来
改成了
public void testDigest(string str)
但是不能像C里面那样调用啊,这里面还有什么玄机还请大神指点
如果你要返回一个字符串,就不能用void类型,你把你写的贴出来看看,不明白你说的象C里面那样调用?
* 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直接报错啊
首先你的testDigest方法本身没有返回值。
你要在testDigest方法后面加上return,即在try的最后加上return byte2hex(digesta);在testDigest方法的最后加上return "";
其次,别人的例子只是为了说明用法而在里面作了一次比较,你没必要把testDigest方法内存的代码全部保留,因为你只是想得到一个摘要信息,得到以后,就可以renturn了,java.security.MessageDigest algb = java.security.MessageDigest.getInstance("SHA-1");以后的代码可以不要了。