今天在使用MD5对明文加密的时候出现异常
异常代码
MD5EncodeResult =Hex.encodeHexString(md5Bytes);
系统没报错,出现也正常运行,但在执行这条语句时,程序异常退出
情况如下
异常完整代码如下
package com.jluzh.UtilActivity;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.networksecurity.R;
public class MD5Activity extends Activity{
public static final String TAG = "MD5";
private static Button MD5Encode;
private static Button MD5Clear;
private static EditText edit_src;
private static TextView text_result;
private static String MD5EncodeResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.md5_layout);
MD5Encode = (Button) findViewById(R.id.MD5Encode);
MD5Clear = (Button) findViewById(R.id.MD5Clear);
edit_src = (EditText) findViewById(R.id.edit_src);
text_result = (TextView) findViewById(R.id.text_result);
//设置MD5 Button加密点击事件
MD5Encode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try {
Log.d(TAG, "执行加密");
//取得编辑框的内容
String src = edit_src.getText().toString();
//使用JDK MD5加密
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md.digest(src.getBytes());
Log.d(TAG, "进行转换");
MD5EncodeResult =Hex.encodeHexString(md5Bytes);
Log.d(TAG, MD5EncodeResult);
//文本框显示MD5加密后的密文
text_result.setText(MD5EncodeResult);
Log.d(TAG, "加密完成");
} catch (Exception e) {
e.printStackTrace();
}
}//MD5EncodeOnClick结束
});//MD5EncodesetOnClickListener结束
//设置清空内容点击事件
MD5Clear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Log.d(TAG, "执行清空");
edit_src.setText("");
text_result.setText("");
Log.d(TAG, "已清空");
}//MD5ClearOnClick结束
});//MD5ClearSetOnClickListener结束
}//MD5ActivityOnCreate结束
}//MD5Activity类结束
程序可以运行
点击加密出现异常
异常信息
解决方法:
MD5EncodeResult =Hex.encodeHexString(md5Bytes);
要对md5Bytes数组进行16进制转换
在MD5Activity类中添加一个方法
private static String toHexString(byte[] bytes, String separator) { //转为十六进制
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xFF & b);
if(hex.length() == 1){
hexString.append('0');
}
hexString.append(hex).append(separator);
}
return hexString.toString();
}
然后调用方法
MD5EncodeResult =toHexString(md5Bytes,"");
成功运行
无异常代码如下
package com.jluzh.UtilActivity;
import java.security.MessageDigest;
import org.apache.commons.codec.binary.Hex;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.example.networksecurity.R;
public class MD5Activity extends Activity{
public static final String TAG = "MD5";
private static Button MD5Encode;
private static Button MD5Clear;
private static EditText edit_src;
private static TextView text_result;
private static String MD5EncodeResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.md5_layout);
MD5Encode = (Button) findViewById(R.id.MD5Encode);
MD5Clear = (Button) findViewById(R.id.MD5Clear);
edit_src = (EditText) findViewById(R.id.edit_src);
text_result = (TextView) findViewById(R.id.text_result);
//设置MD5 Button加密点击事件
MD5Encode.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
try {
Log.d(TAG, "执行加密");
//取得编辑框的内容
String src = edit_src.getText().toString();
//使用JDK MD5加密
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md.digest(src.getBytes());
Log.d(TAG, "进行转换");
MD5EncodeResult =toHexString(md5Bytes,"");
Log.d(TAG, MD5EncodeResult);
//文本框显示MD5加密后的密文
text_result.setText(MD5EncodeResult);
Log.d(TAG, "加密完成");
} catch (Exception e) {
e.printStackTrace();
}
}//MD5EncodeOnClick结束
});//MD5EncodesetOnClickListener结束
//设置清空内容点击事件
MD5Clear.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Log.d(TAG, "执行清空");
edit_src.setText("");
text_result.setText("");
Log.d(TAG, "已清空");
}//MD5ClearOnClick结束
});//MD5ClearSetOnClickListener结束
}//MD5ActivityOnCreate结束
private static String toHexString(byte[] bytes, String separator) { //转为十六进制
StringBuilder hexString = new StringBuilder();
for (byte b : bytes) {
String hex = Integer.toHexString(0xFF & b);
if(hex.length() == 1){
hexString.append('0');
}
hexString.append(hex).append(separator);
}
return hexString.toString();
}
}//MD5Activity类结束