写作目的

通常我们在使用加密算法时,都是直接调用一个方法,比如Base64,直接把待加密的字符串给加密好了。对于某些使用公私钥的算法,最多再传入一段公钥即可。但是在使用MD5算法的时候,总是需要用到一个叫做Digest的东西,然后再经过一段有些神秘的代码把二进制转十六进制,才能获得想要的MD5“加密”后的结果。

我在之前用到MD5加密时,对此感到疑惑,但是仅仅把别人写好的代码拿来用,并未深究原因,知其然而不知其所以然。所以抽时间搞清楚了原因,并写下这篇文章作为记录。

MD5根本不是加密

MD5的全称是MD5消息摘要算法(MD5 Message-Digest Algorithm),是消息摘要算法的第五版。因此MD5的主要用途是用于验证消息传递途中的完整性,但并不隐藏消息内容。而我们日常所说的加密算法,一般是为了使消息在传输过程中不要被中间人查看或者篡改,并且消息的接收方式有方法解密并查看到完整的原始消息。

简单来说,加密后的信息是完整的,可以解密得到原始数据;摘要得到的信息不完整,无法恢复原始数据。所以MD5算法和加密算法的用途并不相同。严格来说,MD5并不能被称为加密算法。

MD5到底在做什么
顾名思义,消息摘要算法,“摘要”是其中重要的步骤,这也就提到了本文一开始所说的Digest的作用。

MD5在Java中的使用流程如下:
1. 创建一个MD5摘要算法的对象

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

2. 将待处理的字符串转换为字节数组

byte[] byteMessage = message.getBytes();

3. 用摘要算法对象处理该字节数组,得到一个128位的摘要字节数组

byte[] buffer = md.digest(byteMessage);

4. 把数组每一字节(一个字节占八位)转换成16进制,得到原始消息的MD5值

String md5str = bytesToHex(buffer);

从上述过程中可以看出,MD5算法的处理过程明确分为摘要和将摘要字节拼接成十六进制串这两个阶段。

小结
弄清楚了MD5的含义,我也明白了MD5和加密没什么关系。以后提起MD5时,再不会顺口说出“MD5加密”这种话来了。

MD5是什么,怎么用着怪怪的的更多相关文章

  1. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  2. Android数据加密之MD5加密

    前言: 项目中无论是密码的存储或者说判断文件是否是同一文件,都会用到MD5算法,今天来总结一下MD5加密算法. 什么是MD5加密? MD5英文全称“Message-Digest Algorithm 5 ...

  3. [C#] 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

    using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Wen. ...

  4. java单向加密算法小结(2)--MD5哈希算法

    上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...

  5. android_m2repository_rxx.zip下载地址以及MD5

    地址 MD5 https://dl-ssl.google.com/android/repository/android_m2repository_r08.zip 8C8EC4C731B7F55E646 ...

  6. 一种简单的md5加盐加密的方法(防止彩虹表撞库)

    md5加密(或者说摘要算法)大家都很熟悉了 就不解释了 现在很多数据库设计都喜欢用单向加密的方式保存密码,验证时对提交的密码再次加密之后做密文对比 /// <summary> 使用MD5加 ...

  7. 2、摘要函数——MD2/MD4/MD5数字签名

    摘要是用来防止数据被私自改动的方法,其中用到的函数叫做摘要函数.这些函数的输入可以是任意大小的信息,但是输出是大小固定的摘要.摘要有个重要的特性:如果改变了输入信息的任何内容,即使改变一位,输出也将发 ...

  8. c#官方推荐md5通用加密类

    /// <summary> /// MD5加密 /// </summary> /// <param name="input">需要加密的字符串& ...

  9. 密码学应用(DES,AES, MD5, SHA1, RSA, Salt, Pkcs8)

    目录 一.数据加密标准 - Data Encryption Standard(DES) 二.高级加密标准 - Advanced Encryption Standard(AES) 三.消息摘要算法第五版 ...

随机推荐

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    关于网页中第一行<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  2. shell编程的一些例子4

    bash支持一维数组 1.数组定义: name= (value1,value2...valueN) value形如[[subscript]=]string [subscript]= 是可选项  如果没 ...

  3. POJ 3273 Monthly Expense 二分枚举

    题目:http://poj.org/problem?id=3273 二分枚举,据说是经典题,看了题解才做的,暂时还没有完全理解.. #include <stdio.h> #include ...

  4. leetcode第四题:Median of Two Sorted Arrays (java)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

  5. c++ 标准委员会网址

    c++ 标准委员会网址: http://www.open-std.org/ C++11 文档网址: http://www.open-std.org/jtc1/sc22/wg21/docs/papers ...

  6. sharepoint 2013创建外部内容类型并创建外部列表

    步骤: 1.如何:基于 SQL Server 表创建外部内容类型 How to: Create an External Content Type Based on a SQL Server Table ...

  7. Unity3d 协程的注意问题(新手须注意,老手须加勉)

    关于unity3d的协程,非常的好用,比如等待几秒执行,等待下一帧执行等! 但是也有潜在的问题: 1.协程是单线程的,在主线程中完成 2.如果发现yield, 那么这一帧会结束,那么等下一帧调用此脚本 ...

  8. SQL Server GOTO使用实例详解

    GOTO命令用来改变程序执行的流程,使程序跳到标识符指定的程序行再继续往下执行.语法:GOTO  标识符标识符需要在其名称后加上一个冒号“:”.例如:“33:”,“loving:.SQL语句如下:DE ...

  9. 【POJ 2152】 Fire (树形DP)

    Fire   Description Country Z has N cities, which are numbered from 1 to N. Cities are connected by h ...

  10. 使用ListView时遇到的问题

    这周练习ListView时遇到了一个问题,从数据库中查询出的数据绑定到LIstView上,长按某个item进行删除操作,每次点击item取得的id都不对,调了半天终于找到了原因,关键是自己对自定义的B ...