md5算法

MD5加密算法原理及实现

≡放荡痞女 提交于 2020-01-24 23:03:37
本文转自九天之方,原文地址:http://www.cnblogs.com/hjgods/p/3998570.html MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的 消息 进行运行,产生一个128位的消息摘要。 以下所描述的消息长度、填充数据都以位(Bit)为单位,字节序为小端字节。 算法原理 1、数据填充 对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。 填充方法:在消息后面进行填充,填充第一位为1,其余为0。 2、添加消息长度 在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于2 64 ,则只使用其低64位的值,即(消息长度 对 2 64 取模)。 在此步骤进行完毕后,最终消息长度就是512的整数倍。 3、数据处理 准备需要用到的数据: 4个常数: A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476; 4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z)); H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z)); 把消息分以512位为一分组进行处理

【算法】MD5加密

做~自己de王妃 提交于 2020-01-19 06:03:47
1.什么是MD5 MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。将数据(如汉字)运算为另一固定长度值,是杂凑算法的基础原理,MD5的前身有MD2、MD3和MD4。——百度百科 MD5其实不算是加密算法,而是一种信息的摘要。它的特性是不可逆的,所以除了暴力破解 一般逆序算法是得不到结果的。例如:使用如下算法进行加密,对一个字符串利用它的长度和每一位的ASCII相加得出值,比如“bc”那么就是2+98+99=199,如果利用这个算法进行逆推的得出的答案就不唯一,比如"ac",“Ho”,"AAB"等等。 2.MD5加盐 如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。 加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。 3.MD5的加密步骤 接下来大致罗列一下MD5加密的计算步骤,可以参考这个视频, MD5算法视频 1、数据填充

java 计算文件MD5值 大文件

假如想象 提交于 2020-01-10 11:57:38
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性。用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm)。另外还有一种常用的消息摘要算法SHA1。如果想了解这些的话,可以去百度百科:MD5、SHA1、消息摘要算法。 Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果。 1.字符串的MD5(下面的代码有详细注释) public static String stringMD5(String input) { try { // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”) MessageDigest messageDigest =MessageDigest.getInstance("MD5"); // 输入的字符串转换成字节数组 byte[] inputByteArray = input.getBytes(); // inputByteArray是输入字符串转换得到的字节数组 messageDigest.update(inputByteArray); // 转换并返回结果,也是字节数组,包含16个元素 byte[] resultByteArray =

java实现md5加密

巧了我就是萌 提交于 2020-01-03 16:38:14
java实现md5加密 MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的 Ronald L. Rivest 开发出来,经MD2、MD3和MD4发展而来。 一.使用md5加密密码 我们先用java去实现md5加密密码,再去研究一下md5的原理以及他的优缺点。 1.新建MD5.java文件 package com.creditease.bixin.common.util; import sun.misc.BASE64Encoder; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Created by hengyang4 on 2018/6/15. */ public class MD5 { /* * 使用md5进行加密 * * */ public String EncodeByMd5(String str) throws NoSuchAlgorithmException

MD5碰撞后时代,MD5还有存在的意义吗?

[亡魂溺海] 提交于 2020-01-03 16:37:46
MD5是一种HASH函数,又称杂凑函数,由32位16进制组成,在信息安全范畴有广泛和首要运用的暗码算法,它有类似于指纹的运用。在网络安全协议中, 杂凑函数用来处理电子签名,将冗长的签名文件紧缩为一段一起的数字信息,像指纹辨别身份相同保证正本数字签名文件的合法性和安全性。在前面提到的SHA- 1和MD5都是现在最常用的杂凑函数。经过这些算法的处理,初始信息即使只更动一个字母,对应的紧缩信息也会变为大相径庭的“指纹”,这就保证了经过处理 信息的唯一性。为电子商务等提供了数字认证的可能性。   安全的杂凑函数在设计时有必要满意两个请求:其一是寻找两个输入得到相同的输出值在计算上是不可行的,这便是我们一般所说的抗磕碰的;其二是找一个输 入,能得到给定的输出在计算上是不可行的,即不可从效果推导出它的初始状况。现在运用的首要计算机安全协议,如SSL,PGP都用杂凑函数来进行签名,一 旦找到两个文件可以发作相同的紧缩值,就可以假造签名,给网络安全范畴带来无量危险。   MD5便是这样一个在国内外有着广泛的运用的杂凑函数算法,它曾一度被认为是非常安全的。但是MD5也不会完全不重复,从概率来说16的32次 方遍历后至少出现两个相同的MD5值,但是16的32次方有多大?3402823669209384634633746074317.7亿,就算全世界最 快的超级计算机也要跑几十亿年才能跑完。可是

密码学基本原理

删除回忆录丶 提交于 2020-01-01 13:38:16
现代密码学的安全基础是密钥的保密性,而不是像古典密码学那样基于算法的保密性 md5 md5全称为消息摘要算法版本5 (Message Digest Algorithm 5),是一种hash算法 md5就是把不论什么长度的文字内容,给精简成128位散列数 一个MD5值对应着无穷多的原始值,这是个天然缺陷 现在对md5算法的破解,实质就是查彩虹表 事先存好很多 常用密码 的md5值,然后反查,得到对应的原文 暴力破解本来不算是可破解的,但是,如果直接利用用户输入的字符进行MD5,就不一样了。用户的可能输入字符组合相对于随机的字符组合来说非常集中,也就是信息熵其实很低:比如,有一些密码组合会被很多人使用,例如123456,password等 在加密领域,DES和RSA才是真正的加密,而MD5更多的用在文档校验上,用来生成密钥检测文档是否被篡改 常用的哈希函数中,SHA-256、SHA-512 会比 md5 更安全,更难破解 加盐 为了保护用户密码,早期人们使用MD5算法把密码加密后保存,通常计算MD5值时会加一个”盐值“(即一个固定的密串),这个盐值可能是共用的(固定盐),也可能是一个用户一个盐值(随机盐) 数据库存上salt和hash,每当用户注册,随机生成salt, hash = md5(password + salt) 登录的时候验证 md5(input + salt)

模块 hashlib 加密 签名 防篡改

淺唱寂寞╮ 提交于 2019-12-30 19:26:14
hashlib 模块 加密算法: hash (152位)散列 哈希 不可逆得 密码背后就是 hash 程序退出hash 值就变了 ,hash值得结果有可能重复 MD5 (128位) 讯息摘要演算法 基于哈希得 一种加密算法 可产生128位得散列值 (hash value) 永远都不会变 MD5功能: 1.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹); 2.不同的输入得到的不同的结果(唯一性); MD5算法的特点: 压缩性:任意长度的数据,算出的MD5值的长度都是固定的 容易计算:从原数据计算出MD5值很容易 抗修改性:对原数据进行任何改动,修改一个字节生成的MD5值区别也会很大 强抗碰撞:已知原数据和MD5,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。 MD5不可逆的原因是其是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。 MD5用途: 1.防止被篡改: 比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。 比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。 SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5. 2.防止直接看到明文:

Hash算法

人走茶凉 提交于 2019-12-24 00:56:04
  Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的 消息摘要 的函数。   HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系 基本概念    * 若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为 散列函数 (Hash function),按这个思想建立的表为 散列表 。   * 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称冲突。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“象” 作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。   *

MD5算法原理说明

梦想的初衷 提交于 2019-12-08 20:57:34
MD5算法实现: 输入: 不定长度信息(要加密的信息) 输出: 固定长度128-bits。由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。 基本方式为:求余、取余、调整长度、与链接变量进行循环运算。得出结果。 流程图: 1.填充 在MD5算法中,首先 需要对输入信息进行填充 ,使其位长对512求余的结果等于448,并且填充必须进行,即使其位长对512求余的结果等于448。 因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。 填充的方法 如下: 1) 在信息的后面 填充一个1和无数个0 ,直到满足上面的条件时才停止用0对信息的填充。 2) 在这个结果后面附加一个以64位二进制表示的填充前信息长度(单位为Bit) ,如果二进制表示的填充前信息长度超过64位,则取低64位。 经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。 2. 初始化变量(变量值一般不变) 初始的128位值为初试链接变量,这些参数用于第一轮的运算,以大端字节序来表示,他们分别为: ( 在程序中变量A、B、C、D的值分别为0x67452301,0xEFCDAB89,0x98BADCFE,0x10325476 ) A=0x01234567, B

JS调用md5加密

拈花ヽ惹草 提交于 2019-12-05 20:11:43
为了系统的安全,前端一般需要对密码进行md5加密,然后传输给后台处理。 需要引入md5.js,代码如下: 1 var hexcase = 0; 2 var b64pad = ""; 3 var chrsz = 8; 4 function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} 5 function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} 6 function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } 7 function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } 8 function calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} 9 10 function md5_vm_test() 11 { 12 return hex_md5("abc") ==