【Android数据加密与完整性校验之使用MessageDigest类进行MD5/SHA1】MessageDigest类对文件或字符串生成加密摘要进行完整性校验(一)

本文介绍如何使用MD5和SHA-1算法对密码进行加密,并演示了如何验证两个加密后的密码是否一致。文章包括具体实现步骤及代码示例。

 

使用MD5/SHA-1对密码进行加密,并验证两个加密后的密码是否相同。

需要使用到

java.security 
类 MessageDigest

java.lang.Object
  继承者 java.security.MessageDigestSpi
      继承者 java.security.MessageDigest


 

public abstract class MessageDigest
       
        extends 
        MessageDigestSpi
       
       
        

此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。

MessageDigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。

对于给定数量的更新数据,digest 方法只能被调用一次。在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。

1.实例化MessageDigest

MessageDigest md = MessageDigest.getInstance("MD5");

2.进行加密: 使用指定的字节更新摘要。

md.update(val.getBytes());

3.完成加密: 使用指定的 byte 数组对摘要进行最后更新,然后完成摘要计算。

byte[] m = md.digest();

4.判断两个MD5是否相同:比较两个摘要的相等性。

MessageDigest.isEqual(digesta, digestb)

import java.security.*;
/**
 * 进行MD5校验
 * @author Administrator
 *
 */
public class MyDigest {
 //保存16进制各个位数
 private static final char HEX_DIGITS[] = { '0', '1', '2', '3', '4', '5',
   '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };
 /**
  * 程序入口
  * @param args
  */
 public static void main(String[] args) {
  MyDigest my = new MyDigest();
  my.testDigest();
 }
 /**
  * 测试加密校验
  */
 public void testDigest() {
  try {
   String myinfo1 = "测试内容";
   String myinfo2 = "测试结果";
   byte[] digesta = getMD5(myinfo1);// 进行加密
   System.out.println("本信息摘要是:" + byte2hex(digesta));
   System.out.println("本信息摘要是:" + toHexString(digesta));
   // 通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
   byte[] digestb = getMD5(myinfo2);// 进行加密
   // 判断摘要信息是否相同
   if (MessageDigest.isEqual(digesta, digestb)) {
    System.out.println("信息检查正常");
   } else {
    System.out.println("摘要不相同");
   }
  } catch (java.security.NoSuchAlgorithmException ex) {
   System.out.println("非法摘要算法");
  }
 }
 /**
  * 对外的MD5/SHA-1加密算法
  * 
  * @param val
  * @return
  * @throws NoSuchAlgorithmException
  */
 public static byte[] getMD5(String val) throws NoSuchAlgorithmException {
  // 构建算法类
  MessageDigest md5 = MessageDigest.getInstance("MD5");
  md5.update(val.getBytes());// 进行加密计算
  byte[] m = md5.digest();// 加密完成,返回哈希码
  return m;
 }
 /**
  * 将byte数组转换为标准16进制MD5格式字符串
  * 第一种方法
  * @param b
  * @return
  */
 public String byte2hex(byte[] b) // 二行制转字符串
 {
  String hs = "";
  String stmp = "";
  for (int n = 0; n < b.length; n++) {
   stmp = (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();
 }
 /**
  * 转换为MD5标准格式
  * 第2种方法
  * @param b
  * @return
  */
 public static String toHexString(byte[] b) {
  StringBuilder sb = new StringBuilder(b.length * 2);
  for (int i = 0; i < b.length; i++) {
   sb.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
   sb.append(HEX_DIGITS[b[i] & 0x0f]);
   if(i    sb.append(":");
   }
  }
  return sb.toString();
 }
}

-----最后附上运行的结果


这样我们便可以直接使用JDK为我们提供的加密类与函数了!

MessageDigest不仅仅只为我们提供了"MD5"加密,还提供了"SHA-1"

创建的方法只为: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");

MD5与SHA-1的区别为:MD5是16位,SHA是20位(这是两种报文摘要的算法)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值