巨人大哥谈Java面试中常考的信息安全方面知识(MD5)

巨人大哥谈Java面试中常考的信息安全方面知识(MD5)

Java MD5 加密算法介绍以及使用

MD5 算法的介绍

特点 
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 
2、容易计算:从原数据计算出MD5值很容易。 
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。 
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

用途

1.可以用于加密用户密码 
2.可以用于应用安装包的一致性验证

MD5 的简单使用

public class MessageDigestUtil {

    public static String encryptMD5(byte[] data)
            throws NoSuchAlgorithmException {

        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(data);// data 是要加密的信息,格式为 byte 数组
        byte[] resultBytes = md5.digest();//即是经过 MD5 加密过后生成的 byte 数组

        String resultString = resultBytes.toString();
        return resultString;

    }
}

写完之后我们想验证一下数据经过 MD5 加密后回生成怎样的信息,写个主函数类似如下

public class Main {

    public static final String DATA = "hwaphon";

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        String result = MessageDigestUtil.encryptMD5(DATA.getBytes());

        System.out.println(result);
    }

}

运行程序,输出如下

[[email protected]

这个时候我们发现这好像不是我们平常见到的 MD5 格式,对的,我们平常所见的都是 16进制的,而现在是 byte 形式,所以我们需要将其转换为 十六进制,怎么转换呢?

public class Helper {

    public static String bytesToHexString(byte[] src) {
        StringBuilder stringBuilder = new StringBuilder("");
        if (src == null || src.length <= 0) {
            return null;
        }
        for (int i = 0; i < src.length; i++) {
            int v = src[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                stringBuilder.append(0);
            }
            stringBuilder.append(hv);
        }
        return stringBuilder.toString();
    }
}

为什么这么转换呢?大家都知道,16进制每个字符需要 4位 2进制来表示,而 byte 用二进制则占8位,所以我们只需要将每个 byte 转化位两个 16进制表示即可。你可能还对int v = src[i] & 0xFF; 这一行有疑问.

经过上述转化后,将 String resultString = resultBytes.toString(); 转化为 String resultString = Helper.bytesToHexString(resultBytes);

再次运行程序,输出结果为 0dcd7314898e812f223ad0c61bc8a903 , 恩,貌似是那么回事了。

转化成这样又有什么用啊?首先我们想到,当我们写客户端程序时,用户登陆总不能用明文表示吧?如果真是这样的话,那么只要登录的时候数据流被截获,那么我们客户的数据信息可谓是一丝不挂。所以为了安全考虑,我们可以在对用户名和密码都进行MD5加密,注意 MD5 算法是不可逆的,也就是说就算MD5加密过后的数据被截获了,也不可能还原原数据。

验证一致性

当我们下载程序安装包的过程中,程序可能会被非法篡改,怎么判断自己下载的程序由没有被篡改呢? 有些程序在下载的时候,官方就会给出 MD5 的值,那么我们下载过后怎么用来验证呢?下面拿搜狗拼音安装包来举例,获取它的MD5值

public static String getMD5OfFile(String path) throws Exception {

        FileInputStream stream = new FileInputStream(new File(path));
        DigestInputStream digestInputStream = new DigestInputStream(stream,
                MessageDigest.getInstance("MD5"));

        byte[] buffer = new byte[1024];
        int read = digestInputStream.read(buffer, 0, 1024);
        while (read != -1) {
            read = digestInputStream.read(buffer, 0, 1024);
        }

        MessageDigest dis = digestInputStream.getMessageDigest();
        byte[] resultBytes = dis.digest();

        String resultString = Helper.bytesToHexString(resultBytes);
        return resultString;
    }

测试一下

public class Main {

    public static final String PATH = "sogoupinyin_2.0.0.0078_amd64.deb";

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {

        String result = MessageDigestUtil.getMD5OfFile(PATH);

        System.out.println(result);
    }
}

输出结果

0a4e81d7a9cae7e8597371b1fa3674aa

这个时候,如果我在下载的时候官方也提供给一个 MD5值,那么我现在就可以去比对了,如果完全吻合,说明我下载的程序没有被非法篡改,如果不一样,那么说明。。。。

原文地址:https://www.cnblogs.com/jurendage/p/8716538.html

时间: 2024-08-09 07:45:43

巨人大哥谈Java面试中常考的信息安全方面知识(MD5)的相关文章

巨人大哥谈Java中的Synchronized关键字用法

巨人大哥谈Java中的Synchronized关键字用法 认识synchronized 对于写多线程程序的人来说,经常碰到的就是并发问题,对于容易出现并发问题的地方价格synchronized基本上就搞定 了,如果说不考虑性能问题的话,这一操绝对能应对百分之九十以上的情况,若对于性能方面有要求的话就需要额外的知识比如读写锁等等.本文目的先了解透彻synchronized的基本原理. Synchronized的基本使用 Synchronized的作用主要有三个: (1)确保线程互斥的访问同步代码 

巨人大哥谈Java工程师高手之路

巨人大哥谈Java工程师高手之路 JVM方面 JVM内存结构 堆.栈.方法区.直接内存.堆和栈区别 Java内存模型 内存可见性.重排序.顺序一致性.volatile.锁.final 垃圾回收 内存分配策略.垃圾收集器(G1).GC算法.GC参数.对象存活的判定 JVM参数及调优 Java对象模型 oop-klass.对象头 HotSpot 即时编译器.编译优化 类加载机制 classLoader.类加载过程.双亲委派(破坏双亲委派).模块化(jboss modules.osgi.jigsaw)

Java面试中常问的Spring方面问题

Spring Framework 现在几乎已成为 Java Web 开发的标配框架.那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下. 1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? Version FeatureSpring 2.5 发布于 2007 年.这是第一个支持注解的版本.Spring 3.0 发布于 2009 年.它完全利用了 Java5 中的改进,并为 JEE6 提供了支持.Spring

Java面试2018常考题目汇总(一)(转)

一.JAVA基础篇-概念 1.简述你所知道的Linux: Linux起源于1991年,1995年流行起来的免费操作系统,目前, Linux是主流的服务器操作系统, 广泛应用于互联网.云计算.智能手机(Android)等领域.由于Java主要用于服务器端的开发,因此Java应用的部署环境有很多为Linux. Windows操作系统的目录结构,是以盘符为单位,C盘.D盘.E盘等等,数据存储在各个盘符之下,而Linux操作系统最顶层只有一个根目录root,所有文件都存储在这一个根目录之下. Linux

Java面试中常问的Spring方面问题(55道含答案)

Spring Framework 现在几乎已成为 Java Web 开发的标配框架.那么,作为 Java 程序员,你对 Spring 的主要技术点又掌握了多少呢?不妨用本文的问题来检测一下. 1.一般问题 1.1. 不同版本的 Spring Framework 有哪些主要功能? VersionFeatureSpring 2.5发布于 2007 年.这是第一个支持注解的版本.Spring 3.0发布于 2009 年.它完全利用了 Java5 中的改进,并为 JEE6 提供了支持.Spring 4.

Java面试中常问的计算机网络方面问题

GET 和 POST 的区别 (GET)请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:/test/demo_form.asp?name1=value1&name2=value2 GET 请求可被缓存 GET 请求保留在浏览器历史记录中 GET 请求可被收藏为书签 GET 请求不应在处理敏感数据时使用 GET 请求有长度限制 GET 请求只应当用于取回数据POST 方法(POST)请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:POST

快速排序(面试中常考)

package com.atguigu.array.sort; /** * 快速排序 * 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分关键字小, * 则分别对这两部分继续进行排序,直到整个序列有序. * @author shkstart * 2018-12-17 */public class QuickSort { private static void swap(int[] data, int i, int j) { int temp = data[i]; d

Java面试题中常考的容易混淆的知识点区别

以下是我收集的Java编程里各种区别,供Java学习爱好者参考,这些区别都是每次Java面试中常考的,大家好好掌握,如有失误请留言指出.想要获取Java详细全套学习资料请到上海尚学堂官网获取. 1.HashMap和Hashtable的区别. HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable. HashMap允许将null作为一个entry的key

如何在Java面试中谈工资

在面试中,工资这块是不得不谈的,即使HR没有主动提起工资的问题,你也得主动顺其自然的跟HR谈起工资.为什么是顺其自然呢?因为在面试中谈工资也是项技术活,比如谈的太早,那么你们接下的的面试沟通环节就会崩塌.在Java面试中也是一样,今天就跟长沙尚学堂小编一起来看看,如何在Java面试中谈工资? 如何在Java面试中谈工资? 1. 有的朋友属于很急的性子,觉得自己在Java面试中,最关注的问题就是工资,总喜欢在Java面试中直接开门见山的问HR:我一个月能够拿到多少工资呢?如果HR也是你一样的性子,