Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 363|回复: 0

[Java基础知识]消息摘要计算一例

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-2 12:59:43 | 显示全部楼层 |阅读模式
    一、什么是消息摘要
         一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。 二、消息摘要有两个基本属性: 1、两个不同的报文难以生成相同的摘要;
    2、绝不能从消息摘要生成原数据 三、消息摘要的应用
    1、消息摘要主要用于验证数据的完整性,我们经常听到的校验
          和就是消息摘要的一个特例。 2、MAC:消息认证码,使用秘密密钥和消息摘要算法来创建消息摘要。  
      
       
       
         
       

         
       
      
        我们可能经常会疑问,我们有了消息摘要为什么还要认证码呢消息摘要的算法可以确保消息摘要和具体的消息之间的一一对应,也就是只要你有相同的消息,采用相同的算法肯定能产生相同的消息摘要,但有时为了特殊的目的我们需要只有特定的人才能生成这个摘要,这时候我们可以通过在生成消息摘要的过程中加入相应的密钥,从而使生成的消息摘要在没有密钥的情况下难以生成。    鉴于消息摘要的一一对应,经常在一些保护用户密码的地方我们采用了这种算法。例如,在银行系统,为了不让管理数据库的员工把你的密码看到,系统本身在你的密码存入库中之前就做了消息摘要的提取,这样库中别人看到的是一串奇怪的串,他也没法逆向获得你的明文密码。当然,如果银行的安全系统被控制,那什么事情都可以做。 四、消息摘要的计算
       java.security包中的MessageDigest类提供了计算消息摘要的方法, 首先生成对象,执行其update()方法可以将原始数据传递给该对象,然后执行其digest()方法即可得到消息摘要。具体步骤如下:  1、首先用生成一个MessageDigest类,确定计算方法
         java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");     MessageDigest类也是一个工厂类,其构造器是受保护的,不允许直接使用new MessageDigist( )来创建对象,而必须通过其静态方法getInstance()生成MessageDigest对象。其中传入的参数指定计算消息摘要所使用的算法,常用的有"MD5","SHA","SHA-1"等 2、添加要进行计算摘要的信息
         alga.update(myinfo.getBytes()); 3、计算出摘要
        byte[] digesta=alga.digest();   把你的信息和摘要发送给其他人,其他人用相同的方法初始化,添加信息,最后进行比较摘要是否相同。 4、algb.isEqual(digesta,algb.digest()) 相关AIP java.security.MessageDigest 类 static getInstance(String algorithm)
       返回一个MessageDigest对象,它实现指定的算法,参数:算法名,如 SHA-1 或MD5 void update (byte input)
    void update (byte[] input)
    void update(byte[] input, int offset, int len)
        添加要进行计算摘要的信息 byte[] digest()
        完成计算,返回计算得到的摘要(对于MD5是16位,SHA是20位) void reset()
        复位 static boolean isEqual(byte[] digesta, byte[] digestb)
        比效两个摘要是否相同 五、代码:
    1. import java.security.*;
    2. public class myDigest {
    3.   public static void main(String[] args)  {
    4.     myDigest my=new myDigest();
    5.     my.testDigest();
    6.   }
    7.   public void testDigest()
    8.   {
    9.    try {
    10.      String myinfo="我的测试信息";
    11.     //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
    12.       java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
    13.       alga.update(myinfo.getBytes());
    14.       byte[] digesta=alga.digest();

    15.       System.out.println("本信息摘要是:"+byte2hex(digesta));
    16.       //通过某中方式传给其他人你的信息(myinfo)和摘要(digesta) 对方可以判断是否更改或传输正常
    17.       java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
    18.       algb.update(myinfo.getBytes());
    19.       if (algb.isEqual(digesta,algb.digest())) {
    20.          System.out.println("信息检查正常");
    21.        }
    22.        else
    23.         {
    24.           System.out.println("摘要不相同");
    25.          }
    26.    }
    27.    catch (java.security.NoSuchAlgorithmException ex) {
    28.      System.out.println("非法摘要算法");
    29.    }
    30.   }

    31.   public String byte2hex(byte[] b) //二行制转字符串
    32.     {
    33.      String hs="";
    34.      String stmp="";
    35.      for (int n=0;n< b.length;n++)
    36.       {
    37.        stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
    38.        if (stmp.length()==1) hs=hs+"0"+stmp;
    39.        else hs=hs+stmp;
    40.        if (n< b.length-1)  hs=hs+":";
    41.       }
    42.      return hs.toUpperCase();
    43.     }
    44. }
    复制代码
    运行结果: C:java>java myDigest
    本信息摘要是:4D:8C:34:1F:EF:37:B2:1F:7F:1D:66:7B:47:A0:FE:ED:E9:9B:CB:98
    信息检查正常

      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/2/125943062.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-14 02:15 , Processed in 0.416979 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表