使用Java实现MD5散列计算

合集下载

java中常用的md5方法

java中常用的md5方法

java中常用的md5方法Java是一种广泛使用的编程语言,特别适合用于开发各种类型的应用程序。

在Java中,MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,用于产生唯一的消息摘要。

本文将详细介绍在Java中常用的MD5方法。

第一步:导入相关的包使用MD5算法需要导入Java的Security包。

在代码的开头加上以下导入语句:import java.security.MessageDigest;第二步:创建一个方法在Java中,我们可以创建一个方法用于计算MD5消息摘要。

下面是一个示例:public static String getMD5(String input) {try {MessageDigest md =MessageDigest.getInstance("MD5"); 创建MD5加密对象byte[] messageDigest = md.digest(input.getBytes()); 获取二进制摘要值转化为十六进制字符串形式StringBuilder hexString = new StringBuilder();for (byte b : messageDigest) {String hex = Integer.toHexString(0xFF & b);if (hex.length() == 1) {hexString.append('0');}hexString.append(hex);}return hexString.toString();} catch (Exception ex) {ex.printStackTrace();return null;}}第三步:调用方法要使用这个方法,只需在代码中调用getMD5()方法,并传递要进行MD5加密的消息作为参数。

以下是一个使用示例:String input = "Hello World";String md5Hash = getMD5(input);System.out.println("MD5加密后的结果:" + md5Hash);以上代码将输出:MD5加密后的结果:0a4d55a8d778e5022fab701977c5d840第四步:解释代码让我们来解释一下上面的代码。

Java实现MD5加密及解密的代码实例分享

Java实现MD5加密及解密的代码实例分享

Java实现MD5加密及解密的代码实例分享基础:MessageDigest类的使⽤其实要在Java中完成MD5加密,MessageDigest类⼤部分都帮你实现好了,⼏⾏代码⾜矣:/*** 对字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static String getMD5(String str) {try {// ⽣成⼀个MD5加密计算摘要MessageDigest md = MessageDigest.getInstance("MD5");// 计算md5函数md.update(str.getBytes());// digest()最后确定返回md5 hash值,返回值为8为字符串。

因为md5 hash值是16位的hex值,实际上就是8位的字符// BigInteger函数则将8位的字符串转换成16位hex值,⽤字符串来表⽰;得到字符串形式的hash值return new BigInteger(1, md.digest()).toString(16);} catch (Exception e) {throw new SpeedException("MD5加密出现错误");}}进阶:加密及解密类Java实现MD5加密以及解密类,附带测试类,具体见代码。

MD5加密解密类——MyMD5Util,代码如下package com.zyg.security.md5;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.util.Arrays;public class MyMD5Util {private static final String HEX_NUMS_STR="0123456789ABCDEF";private static final Integer SALT_LENGTH = 12;/*** 将16进制字符串转换成字节数组* @param hex* @return*/public static byte[] hexStringToByte(String hex) {int len = (hex.length() / 2);byte[] result = new byte[len];char[] hexChars = hex.toCharArray();for (int i = 0; i < len; i++) {int pos = i * 2;result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4| HEX_NUMS_STR.indexOf(hexChars[pos + 1]));}return result;}/*** 将指定byte数组转换成16进制字符串* @param b* @return*/public static String byteToHexString(byte[] b) {StringBuffer hexString = new StringBuffer();for (int i = 0; i < b.length; i++) {String hex = Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}hexString.append(hex.toUpperCase());}return hexString.toString();}/*** 验证⼝令是否合法* @param password* @param passwordInDb* @return* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static boolean validPassword(String password, String passwordInDb)throws NoSuchAlgorithmException, UnsupportedEncodingException {//将16进制字符串格式⼝令转换成字节数组byte[] pwdInDb = hexStringToByte(passwordInDb);//声明盐变量byte[] salt = new byte[SALT_LENGTH];//将盐从数据库中保存的⼝令字节数组中提取出来System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);//创建消息摘要对象MessageDigest md = MessageDigest.getInstance("MD5");//将盐数据传⼊消息摘要对象md.update(salt);//将⼝令的数据传给消息摘要对象md.update(password.getBytes("UTF-8"));//⽣成输⼊⼝令的消息摘要byte[] digest = md.digest();//声明⼀个保存数据库中⼝令消息摘要的变量byte[] digestInDb = new byte[pwdInDb.length - SALT_LENGTH];//取得数据库中⼝令的消息摘要System.arraycopy(pwdInDb, SALT_LENGTH, digestInDb, 0, digestInDb.length); //⽐较根据输⼊⼝令⽣成的消息摘要和数据库中消息摘要是否相同if (Arrays.equals(digest, digestInDb)) {//⼝令正确返回⼝令匹配消息return true;} else {//⼝令不正确返回⼝令不匹配消息return false;}}/*** 获得加密后的16进制形式⼝令* @param password* @return* @throws NoSuchAlgorithmException* @throws UnsupportedEncodingException*/public static String getEncryptedPwd(String password)throws NoSuchAlgorithmException, UnsupportedEncodingException {//声明加密后的⼝令数组变量byte[] pwd = null;//随机数⽣成器SecureRandom random = new SecureRandom();//声明盐数组变量byte[] salt = new byte[SALT_LENGTH];//将随机数放⼊盐变量中random.nextBytes(salt);//声明消息摘要对象MessageDigest md = null;//创建消息摘要md = MessageDigest.getInstance("MD5");//将盐数据传⼊消息摘要对象md.update(salt);//将⼝令的数据传给消息摘要对象md.update(password.getBytes("UTF-8"));//获得消息摘要的字节数组byte[] digest = md.digest();//因为要在⼝令的字节数组中存放盐,所以加上盐的字节长度pwd = new byte[digest.length + SALT_LENGTH];//将盐的字节拷贝到⽣成的加密⼝令字节数组的前12个字节,以便在验证⼝令时取出盐 System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH);//将消息摘要拷贝到加密⼝令字节数组从第13个字节开始的字节System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length);//将字节数组格式加密后的⼝令转化为16进制字符串格式的⼝令return byteToHexString(pwd);}}测试类——Client,代码如下:package com.zyg.security.md5;import java.io.UnsupportedEncodingException;import java.security.NoSuchAlgorithmException;import java.util.HashMap;import java.util.Map;public class Client {private static Map users = new HashMap();public static void main(String[] args){String userName = "zyg";String password = "123";registerUser(userName,password);userName = "changong";password = "456";registerUser(userName,password);String loginUserId = "zyg";String pwd = "1232";try {if(loginValid(loginUserId,pwd)){System.out.println("欢迎登陆");}else{System.out.println("⼝令错误,请重新输⼊");}} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 注册⽤户** @param userName* @param password*/public static void registerUser(String userName,String password){String encryptedPwd = null;try {encryptedPwd = MyMD5Util.getEncryptedPwd(password);users.put(userName, encryptedPwd);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 验证登陆** @param userName* @param password* @return* @throws UnsupportedEncodingException* @throws NoSuchAlgorithmException*/public static boolean loginValid(String userName,String password)throws NoSuchAlgorithmException, UnsupportedEncodingException{String pwdInDb = (String)users.get(userName);if(null!=pwdInDb){ // 该⽤户存在return MyMD5Util.validPassword(password, pwdInDb);}else{System.out.println("不存在该⽤户");return false;}}}PS:这⾥再为⼤家提供2款MD5加密⼯具,感兴趣的朋友可以参考⼀下:MD5在线加密⼯具:在线MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密⼯具:。

md5码算术公式

md5码算术公式

md5码算术公式MD5算术公式指的是通过MD5算法计算出的MD5哈希值的数学公式。

MD5算法将任意长度的数据转换成固定长度(16字节,32个十六进制字符)的哈希值。

然而,这个转换过程不是通过一个简单的算术公式进行的,而是通过复杂的位运算、逻辑运算和循环来完成的。

因此,没有一个简单的算术公式可以表示MD5算法的全部过程。

不过,我们可以通过伪代码来展示MD5算法的基本步骤:1. 初始化MD5变量:A = 0x67452301B = 0xefcdab89C = 0x98badcfeD = 0x103254762. 将输入数据进行分块处理(每个块512位),并在每个块的末尾添加一个额外的比特位,使其长度满足模64等于56。

3. 对每个块进行以下四轮循环操作:a. 初始化四个缓冲区变量:Atemp = A, Btemp = B, Ctemp = C, Dtemp = Db. 第一轮循环:i. 将Atemp、Btemp、Ctemp、Dtemp的值保存在临时变量中ii. 在当前块中进行一系列的位运算、逻辑运算和循环iii. 将临时变量的值累加到Atemp、Btemp、Ctemp、Dtemp中c. 第二轮循环:同样的操作,但使用不同的逻辑函数和常数d. 第三轮循环:同样的操作,但使用不同的逻辑函数和常数e. 第四轮循环:同样的操作,但使用不同的逻辑函数和常数4. 将最终的Atemp、Btemp、Ctemp、Dtemp的值累加到A、B、C、D中(即A = A + Atemp,B = B + Btemp,C = C + Ctemp,D = D + Dtemp)。

5. 将A、B、C、D的值以十六进制形式表示,即为MD5哈希值。

需要注意的是,以上的伪代码只是一个简化的示例,真正的MD5算法中还包括了一些具体的位运算和逻辑运算规则,详细算法细节可以参考MD5算法的描述和实现。

md5 计算命令

md5 计算命令

md5 计算命令MD5是一种常用的哈希算法,它将任意长度的消息转换为长度固定、编码方式唯一的128位哈希值,通常用于校验数据完整性、防止篡改和验证数据的一致性。

在计算机领域中,MD5算法可以通过命令行进行调用和使用,本文将围绕MD5计算命令进行详细讲解。

一、打开命令行终端首先要想使用MD5计算命令,我们需要首先打开命令行终端。

在Windows下,可以按下Win+R组合键打开运行框,输入cmd命令后回车打开命令行终端;在Mac OS X下,可以按下Command+Space组合键打开Spotlight搜索,在搜索栏中输入Terminal命令来打开命令行终端。

二、进入目标文件所在目录接下来,我们需要进入我们需要计算MD5值的文件所在目录。

在Windows下,可以使用cd命令进入指定目录,例如cd D:\test,表示进入D盘下的test目录。

在Mac OS X下,同样可以使用cd命令进入指定目录,例如cd /Users/username/Documents,表示进入当前用户的Documents目录。

三、计算目标文件的MD5值进入目标文件所在的目录后,我们就可以使用MD5计算命令计算目标文件的MD5值了。

在Windows下,可以使用certutil命令计算MD5值,例如certutil -hashfile test.txt MD5,表示计算当前目录下的test.txt文件的MD5值。

在Mac OS X下,可以使用md5命令计算MD5值,例如md5 test.txt,表示计算当前目录下的test.txt文件的MD5值。

计算完成后,将会显示出一个32位的MD5值,可以用于校验文件的完整性。

四、计算多个文件的MD5值如果需要计算多个文件的MD5值,并将结果保存到一个文本文件中,可以使用MD5计算命令的一些参数来实现。

在Windows下,可以使用for循环和echo命令实现,例如for %i in (*.txt) doecho %i >> md5.txt & certutil -hashfile %i MD5 >> md5.txt,表示计算当前目录下所有的txt文件的MD5值,并将结果保存到md5.txt 文件中。

stackoverflow的md5计算方法

stackoverflow的md5计算方法

stackoverflow的md5计算方法【实用版4篇】目录(篇1)1.Stack Overflow 的 MD5 计算方法简介2.MD5 算法的原理3.Python 中的 MD5 计算方法4.Stack Overflow 上的 MD5 计算实例5.总结正文(篇1)一、Stack Overflow 的 MD5 计算方法简介MD5(Message-Digest Algorithm 5)是一种广泛应用的哈希函数,可以用于数据完整性校验、数据加密等场景。

Stack Overflow 作为一个知名的编程问答社区,其 MD5 计算方法也被广大开发者所关注。

二、MD5 算法的原理MD5 算法基于 RSA 加密算法,通过对输入数据进行异或操作、左移、填充位、迭代等步骤,最终将数据映射为一个 128 位的哈希值。

MD5 算法具有碰撞耐性(collision resistance)和单向性(one-way property)等特点。

三、Python 中的 MD5 计算方法在 Python 中,可以使用内置的 hashlib 库来实现 MD5 计算。

以下是一个简单的示例:```pythonimport hashlibtext = "Hello, world!"md5 = hashlib.md5()md5.update(text.encode("utf-8"))result = md5.hexdigest()print(result)```四、Stack Overflow 上的 MD5 计算实例在 Stack Overflow 上,MD5 计算方法被广泛应用于数据加密、用户密码存储等场景。

例如,当用户在网站上注册时,可以将用户密码进行 MD5 加密后存储在数据库中,以保证数据的安全性。

五、总结MD5 算法是一种广泛应用的哈希函数,具有碰撞耐性和单向性等特点。

在 Python 中,可以使用 hashlib 库来实现 MD5 计算。

md5计算过程

md5计算过程

MD5(Message Digest Algorithm 5)是一种广泛使用的散列算法,它可以将任意长度的数据转换为一个固定长度(128位)的散列值。

MD5算法具有良好的抗修改性、弱抗碰撞和强抗碰撞特性,但它容易受到暴力破解和彩虹表攻击。

尽管如此,MD5算法在许多场景下仍然具有一定的应用价值。

下面将详细介绍MD5计算过程。

MD5计算过程主要包括四个步骤:填充、分组、计算和汇总。

1. 填充:首先,将待处理的数据按照512位进行分组。

如果最后一组数据的长度不足512位,则需要用0填充至512位。

此外,还需要在数据后面添加一个64位的长度字段,表示原始数据的长度。

2. 分组:将填充后的数据分为若干个512位的分组。

每个分组分别进行计算,最终将这些计算结果进行汇总,得到最终的散列值。

3. 计算:对于每个分组,需要进行四轮计算。

每轮计算包括多个步骤,如位移、异或、求模等。

这些步骤的设计旨在确保散列值的分布均匀,并减少碰撞的可能性。

4. 汇总:将所有分组的计算结果进行汇总,得到最终的128位散列值。

这个散列值就是我们所需要的MD5散列值。

值得注意的是,MD5计算过程是单向的,即从散列值无法直接反推出原始数据。

但正因为这一特性,MD5算法容易受到暴力破解和彩虹表攻击。

为了提高安全性,在实际应用中,我们通常使用MD5算法的变种——MD5加盐算法。

这种算法在计算MD5散列值之前,先将待处理的数据与一个随机生成的盐值进行拼接。

这样,即使两个用户拥有相同的密码,他们的密码散列值也会不同。

JAVA生成MD5校验码及算法实现

JAVA生成MD5校验码及算法实现

JAVA生成MD5校验码及算法实现在Java中,java.security.MessageDigest (rt.jar中)已经定义了MD5 的计算,所以我们只需要简单地调用即可得到MD5 的128 位整数。

然后将此128 位计16 个字节转换成16 进制表示即可。

下面是一个可生成字符串或文件MD5校验码的例子,测试过,可当做工具类直接使用,其中最主要的是getMD5String(String s)和getFileMD5String(File file)两个方法,分别用于生成字符串的md5校验值和生成文件的md5校验值,getFileMD5String_old(File file)方法可删除,不建议使用:package com.why.md5;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.nio.MappedByteBuffer;import java.nio.channels.FileChannel;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Util {/*** 默认的密码字符串组合,用来将字节转换成16 进制表示的字符,apache 校验下载的文件的正确性用的就是默认的这个组合*/protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };protected static MessageDigest messagedigest = null;static {try {messagedigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException nsaex) {System.err.println(MD5Util.class.getName()+ "初始化失败,MessageDigest不支持MD5Util。

Java详解单向加密--MD5、SHA和HMAC及简单实现实例

Java详解单向加密--MD5、SHA和HMAC及简单实现实例

Java详解单向加密--MD5、SHA和HMAC及简单实现实例Java 详解单向加密--MD5、SHA和HMAC及简单实现实例概要:MD5、SHA、HMAC这三种加密算法,可谓是⾮可逆加密,就是不可解密的加密⽅法。

MD5MD5即Message-Digest Algorithm 5(信息-摘要算法5),⽤于确保信息传输完整⼀致。

MD5是输⼊不定长度信息,输出固定长度128-bits的算法。

MD5算法具有以下特点:1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

2、容易计算:从原数据计算出MD5值很容易。

3、抗修改性:对原数据进⾏任何改动,哪怕只修改1个字节,所得到的MD5值都有很⼤区别。

4、强抗碰撞:已知原数据和其MD5值,想找到⼀个具有相同MD5值的数据(即伪造数据)是⾮常困难的。

MD5还⼴泛⽤于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多⽅⾯。

如在Unix系统中⽤户的密码是以MD5(或其它类似的算法)经Hash运算后存储在⽂件系统中。

当⽤户登录的时候,系统把⽤户输⼊的密码进⾏MD5 Hash运算,然后再去和保存在⽂件系统中的MD5值进⾏⽐较,进⽽确定输⼊的密码是否正确。

通过这样的步骤,系统在并不知道⽤户密码的明码的情况下就可以确定⽤户登录系统的合法性。

这可以避免⽤户的密码被具有系统管理员权限的⽤户知道。

MD5将任意长度的“字节串”映射为⼀个128bit的⼤整数,并且通过该128bit反推原始字符串是⾮常困难的。

SHASHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应⽤中重要的⼯具,被⼴泛地应⽤于电⼦商务等信息安全领域。

虽然SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。

SHA所定义的长度下表中的中继散列值(internal state)表⽰对每个数据区块压缩散列过后的中继值(internal hash sum)。

md5算法例子范文

md5算法例子范文

md5算法例子范文MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,通常用于数据完整性验证和密码存储。

它是由美国密码学家罗纳德·李维斯特(Ronald Rivest)于1991年开发的,是MD4的改进版本。

MD5算法将任意长度的输入数据(例如文件、消息等)作为输入,并通过一系列的逻辑函数和位操作转换为固定长度的128位(16个字节)哈希值。

这些哈希值是唯一的,只要原始输入数据不变,就可以保证生成的哈希值相同。

即使输入数据的长度发生微小的改变,生成的哈希值也会非常不同。

下面是通过MD5算法计算字符串"Hello, World!"的示例代码:```pythonimport hashlibdef calculate_md5(string):md5 = hashlib.md5md5.update(string.encode('utf-8'))return md5.hexdigestinput_string = "Hello, World!"md5_hash = calculate_md5(input_string)print(md5_hash)```由于MD5散列函数的基本原理比较复杂,下面详细介绍MD5算法的流程:1. 数据填充:将输入数据的位数扩展为512的倍数。

这个过程包括添加1个比特位"1",然后添加0到k个比特位"0",其中k是满足len(input) + 1 + k ≡ 448 m od 512的最小非负整数。

2.填充长度:用二进制表示的原始输入数据的长度(64位)追加到步骤1的结果中。

3.划分:将填充后的数据分成若干个512位的块。

4.定义变量:初始化四个32位的变量A、B、C和D。

5.迭代:对每个512位的块进行64次操作。

每一次操作由4个轮函数(F、G、H和I)构成,其中每个轮函数都有一个非线性函数和一个混合函数。

使用java获取md5值的两种方法

使用java获取md5值的两种方法

使⽤java获取md5值的两种⽅法Message Digest Algorithm MD5(中⽂名为消息摘要算法第五版)为计算机安全领域⼴泛使⽤的⼀种散列函数,是⼀种⽐较常⽤的哈希算法。

复制代码代码如下:public class md5_test {//MD5的字符串常量private final static String[] hexDigits = { "0", "1", "2", "3", "4","5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public static void main(String[] args) {// TODO Auto-generated method stubtry {MessageDigest messageDigest= MessageDigest.getInstance("MD5");System.out.println(byteArrayToHexString(messageDigest.digest("".getBytes())));} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static String byteArrayToHexString(byte[] b) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++) {resultSb.append(byteToHexString(b[i]));}return resultSb.toString();}/** 将⼀个字节转化成⼗六进制形式的字符串 */private static String byteToHexString(byte b) {int n = b;if (n < 0)n = 256 + n;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}}复制代码代码如下:import mons.codec.digest.DigestUtils;public class ToMain {public static void main(String[] args) {System.out.println(DigestUtils.md5Hex(""));}}。

基于51单片机MD5算法实现

基于51单片机MD5算法实现

基于51单片机MD5算法实现MD5算法是一种广泛使用的密码散列函数,其输出为128位的散列值。

这种算法在计算简单、辅助和速度方面的优点使其被广泛应用于许多领域,如密码学、数据完整性验证和数字签名等。

在本文中,我们将基于51单片机实现MD5算法。

首先,我们需要了解MD5算法的基本原理。

MD5算法主要包括四个步骤:填充、初始向量、处理和输出。

在填充步骤中,我们将输入消息的长度进行填充,以保证其长度是64的倍数。

在初始向量步骤中,我们初始化了4个32位的寄存器:A、B、C和D。

在处理步骤中,我们通过对输入消息进行分组,并进行一系列的位运算来生成散列值。

最后,在输出步骤中,我们将A、B、C、D寄存器的内容连接起来,形成128位的散列值。

在51单片机中,我们可以使用C语言来实现MD5算法。

首先,我们需要定义一些辅助函数来处理字节和位的运算。

以下是一些关键函数的实现示例:-`F`函数:根据输入的X、Y和Z值进行位运算,并返回结果。

-`G`函数:根据输入的X、Y和Z值进行位运算,并返回结果。

-`H`函数:根据输入的X、Y和Z值进行位运算,并返回结果。

-`I`函数:根据输入的X、Y和Z值进行位运算,并返回结果。

- `shift_left`函数:将输入值向左循环移动给定的位数。

-`FF`函数等:定义了一系列的辅助函数来进行特定的位运算。

接下来,我们需要实现MD5算法的核心函数。

以下是MD5算法的一般实现示例:1.初始化MD缓冲区,包括A、B、C、D寄存器的初始值。

2.对输入消息进行填充,并将其分成512位的块。

3.对每个块执行一系列的位运算,包括旋转、移位、与、或等操作。

4.将寄存器的内容连接起来,形成128位的散列值。

在51单片机中实现MD5算法需要注意的是内存和处理速度的限制。

因为51单片机的存储容量较低,因此对于大型输入消息,可能需要进行分块处理和多次运算。

此外,由于单片机处理速度较低,可能需要优化代码以提高执行效率。

java的hash算法实现原理

java的hash算法实现原理

java的hash算法实现原理
Java的哈希算法实现原理主要涉及以下几方面内容:
1. 哈希函数:哈希函数是将任意长度的输入数据转换为固定长度的哈希值的算法,通常使用散列函数来实现。

在Java中,
常用的哈希函数有MD5、SHA-1、SHA-256等。

2. 数字签名:数字签名是使用私钥对数据的哈希值进行加密,以确保数据的完整性和认证性。

在Java中,可以使用提供的
公钥和私钥进行数字签名的生成和验证。

3. 哈希表:哈希表是一种常用的数据结构,用于快速查找和存储数据。

在Java中,HashMap和Hashtable就是常用的哈希表
实现,它们使用哈希函数将键值对映射到对应的桶中,并通过链表或红黑树解决哈希冲突。

4. 哈希冲突:由于哈希函数具有将任意输入映射为固定长度输出的特性,可能会导致不同的输入产生相同的哈希值,这就是哈希冲突。

解决哈希冲突的方法主要有链地址法和开放地址法。

在Java中,HashMap使用链地址法来解决哈希冲突。

5. 哈希算法的应用:哈希算法在Java中有广泛的应用,例如
密码存储、数据校验、唯一标识生成等场景。

在密码存储中,通常会将密码的哈希值存储在数据库中,而不是明文密码,以增加安全性。

在数据校验中,可以使用哈希算法计算数据的哈希值,通过比对哈希值来判断数据是否被篡改。

而在唯一标识生成中,可以使用哈希算法生成具有唯一性的标识符。

总结起来,Java的哈希算法实现原理涉及哈希函数、数字签名、哈希表、哈希冲突以及哈希算法的应用等内容。

java中使用MD5进行计算摘要

java中使用MD5进行计算摘要

java中使⽤MD5进⾏计算摘要java中使⽤MD5进⾏加密在各种应⽤系统的开发中,经常需要存储⽤户信息,很多地⽅都要存储⽤户密码,⽽将⽤户密码直接存储在服务器上显然是不安全的,本⽂简要介绍⼯作中常⽤的 MD5加密算法,希望能抛砖引⽟。

(⼀)消息摘要简介⼀个消息摘要就是⼀个数据块的数字指纹。

即对⼀个任意长度的⼀个数据块进⾏计算,产⽣⼀个唯⼀指印(对于SHA1是产⽣⼀个20字节的⼆进制数组)。

消息摘要是⼀种与消息认证码结合使⽤以确保消息完整性的技术。

主要使⽤单向散列函数算法,可⽤于检验消息的完整性,和通过散列密码直接以⽂本形式保存等,⽬前⼴泛使⽤的算法有MD4、MD5、SHA-1。

消息摘要有两个基本属性:1. 两个不同的报⽂难以⽣成相同的摘要2. 难以对指定的摘要⽣成⼀个报⽂,⽽可以由该报⽂反推算出该指定的摘要代表:美国国家标准技术研究所的SHA1和⿇省理⼯学院Ronald Rivest提出的MD5(⼆)对字符串进⾏加密/**利⽤MD5进⾏加密* @param str 待加密的字符串* @return加密后的字符串* @throws NoSuchAlgorithmException 没有这种产⽣消息摘要的算法* @throws UnsupportedEncodingException*/public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{//确定计算⽅法MessageDigest md5=MessageDigest.getInstance("MD5");BASE64Encoder base64en = new BASE64Encoder();//加密后的字符串String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));return newstr;}调⽤函数:String str="0123456789"System.out.println(EncoderByMd5(str));输出:eB5eJF1ptWaXm4bijSPyxw==(三)验证密码是否正确因为MD5是基于消息摘要原理的,消息摘要的基本特征就是很难根据摘要推算出消息报⽂,因此要验证密码是否正确,就必须对输⼊密码(消息报⽂)重新计算其摘要,和数据库中存储的摘要进⾏对⽐(即数据库中存储的其实为⽤户密码的摘要),若两个摘要相同,则说明密码正确,不同,则说明密码错误。

使用JAVA生成MD5编码

使用JAVA生成MD5编码

使⽤JAVA⽣成MD5编码MD5即Message-Digest Algorithm 5(信息-摘要算法5),是⼀种⽤于产⽣数字签名的单项散列算法,在1991年由MIT Laboratory for Computer Science(IT计算机科学实验室)和RSA Data Security Inc(RSA数据安全公司)的Ronald L. Rivest教授开发出来,经由MD2、MD3和MD4发展⽽来。

MD5算法的使⽤不需要⽀付任何版权费⽤。

它的作⽤是让⼤容量信息在⽤数字签名软件签私⼈密匙前被"压缩"成⼀种保密的格式(将⼀个任意长度的“字节串”通过⼀个不可逆的字符串变换算法变换成⼀个128bit的⼤整数,换句话说就是,即使你看到源程序和算法描述,也⽆法将⼀个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有⽆穷多个,这有点象不存在反函数的数学函数。

)在 Java 中,java.security.MessageDigest 中已经定义了 MD5 的计算,所以我们只需要简单地调⽤即可得到 MD5 的128 位整数。

然后将此 128 位计 16 个字节转换成 16 进制表⽰即可。

代码如下:/**** <p>* Created on 2011-11-25* </p>*/package com.util;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** 功能:MD5加密算法* 公司名称:夏影* 修改时间:2011-11-15*/public class Md5Encrypt {/*** Used building output as Hex*/private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6','7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };/*** 对字符串进⾏MD5加密** @param text* 明⽂** @return密⽂*/public static String md5(String text) {MessageDigest msgDigest = null;try {msgDigest = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {throw new IllegalStateException("System doesn't support MD5 algorithm.");}try {msgDigest.update(text.getBytes("GBK")); //这个加密算法是按照GBK编码进⾏加密} catch (UnsupportedEncodingException e) {throw new IllegalStateException("System doesn't support your EncodingException.");}byte[] bytes = msgDigest.digest();String md5Str = new String(encodeHex(bytes));return md5Str;}public static char[] encodeHex(byte[] data) {int l = data.length;char[] out = new char[l << 1];// two characters form the hex value.for (int i = 0, j = 0; i < l; i++) {out[j++] = DIGITS[(0xF0 & data[i]) >>> 4];out[j++] = DIGITS[0x0F & data[i]];}return out;}}测试代码如下:package com.util;public class TestMD5 {public static void main(String[] args) {// 计算 "a" 的 MD5 代码,应该为:0cc175b9c0f1b6a831c399e269772661System.out.println(Md5Encrypt.md5("a"));}}MD5的典型应⽤是对⼀段Message(字节串)产⽣fingerprint(指纹),以防⽌被"篡改"。

md532位加密原理Java实现md5加密

md532位加密原理Java实现md5加密

md532位加密原理Java实现md5加密md5 32位加密原理简单概括起来,MD5 算法的过程分为四步:处理原⽂,设置初始值,循环加⼯,拼接结果。

第⼀步:处理原⽂⾸先,我们计算出原⽂长度(bit)对 512 求余的结果,如果不等于 448,就需要填充原⽂使得原⽂对 512 求余的结果等于 448。

填充的⽅法是第⼀位填充 1,其余位填充 0。

填充完后,信息的长度就是 512*N+448。

之后,⽤剩余的位置(512-448=64 位)记录原⽂的真正长度,把长度的⼆进制值补在最后。

这样处理后的信息长度就是 512*(N+1)。

第⼆步:设置初始值MD5 的哈希结果长度为 128 位,按每 32 位分成⼀组共 4 组。

这 4 组结果是由 4 个初始值 A、B、C、D 经过不断演变得到。

MD5 的官⽅实现中,A、B、C、D 的初始值如下(16 进制):public class md5Util {/**四个链接变量*/private final int A=0x67452301;private final int B=0xefcdab89;private final int C=0x98badcfe;private final int D=0x10325476;/**ABCD的临时变量*/private int Atemp,Btemp,Ctemp,Dtemp;/**常量ti*公式:floor(abs(sin(i+1))×(2pow32)*/private final int K[]={0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,0x698098d8,0x8b44f7af,0xffff5bb1,0x895cd7be,0x6b901122,0xfd987193,0xa679438e,0x49b40821,0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a,0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665,0xf4292244,0x432aff97,0xab9423a7,0xfc93a039,0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391};/**向左位移数,计算⽅法未知*/private final int s[]={7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21};/**初始化函数*/private void init(){Atemp=A;Btemp=B;Ctemp=C;Dtemp=D;}/**移动⼀定位数*/private int shift(int a,int s){return(a<<s)|(a>>>(32-s));//右移的时候,⾼位⼀定要补零,⽽不是补充符号位 }/**主循环*/private void MainLoop(int M[]){int F,g;int a=Atemp;int b=Btemp;int c=Ctemp;int d=Dtemp;for(int i = 0; i < 64; i ++){if(i<16){F=(b&c)|((~b)&d);g=i;}else if(i<32){F=(d&b)|((~d)&c);g=(5*i+1)%16;}else if(i<48){F=b^c^d;g=(3*i+5)%16;}else{F=c^(b|(~d));g=(7*i)%16;}int tmp=d;d=c;c=b;b=b+shift(a+F+K[i]+M[g],s[i]);a=tmp;}Atemp=a+Atemp;Btemp=b+Btemp;Ctemp=c+Ctemp;Dtemp=d+Dtemp;}/**填充函数*处理后应满⾜bits≡448(mod512),字节就是bytes≡56(mode64)*填充⽅式为先加⼀个1,其它位补零*最后加上64位的原来长度*/private int[] add(String str){int num=((str.length()+8)/64)+1;//以512位,64个字节为⼀组int strByte[]=new int[num*16];//64/4=16,所以有16个整数for(int i=0;i<num*16;i++){//全部初始化0strByte[i]=0;}int i;for(i=0;i<str.length();i++){strByte[i>>2]|=str.charAt(i)<<((i%4)*8);//⼀个整数存储四个字节,⼩端序 }strByte[i>>2]|=0x80<<((i%4)*8);//尾部添加1/**添加原长度,长度指位的长度,所以要乘8,然后是⼩端序,所以放在倒数第⼆个,这⾥长度只⽤了32位 */strByte[num*16-2]=str.length()*8;return strByte;}/**调⽤函数*/public String getMD5(String source){init();int strByte[]=add(source);for(int i=0;i<strByte.length/16;i++){int num[]=new int[16];for(int j=0;j<16;j++){num[j]=strByte[i*16+j];}MainLoop(num);}return changeHex(Atemp)+changeHex(Btemp)+changeHex(Ctemp)+changeHex(Dtemp);}/**整数变成16进制字符串*/private String changeHex(int a){String str="";for(int i=0;i<4;i++){str+=String.format("%2s", Integer.toHexString(((a>>i*8)%(1<<8))&0xff)).replace(' ', '0');}return str;}}。

java实现MD5算法

java实现MD5算法

java实现MD5算法MD5(Message-Digest Algorithm 5)是一种常用的哈希算法,用于对数据进行加密和摘要处理。

Java提供了相关的工具类和方法,可以轻松地实现MD5算法。

下面是一个Java实现MD5算法的示例代码:```javaimport java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Examplepublic static void main(String[] args)String input = "Hello, World!";String md5Hash = getMD5Hash(input);System.out.println("Input: " + input);System.out.println("MD5 Hash: " + md5Hash);}public static String getMD5Hash(String input)try//创建一个MD5算法实例MessageDigest md = MessageDigest.getInstance("MD5"); //将输入转换为字节数组byte[] inputBytes = input.getBytes(;//计算MD5散列值byte[] hashBytes = md.digest(inputBytes);//将散列值转换为十六进制字符串BigInteger hashInt = new BigInteger(1, hashBytes); String hashString = hashInt.toString(16);//补全前导零,使字符串长度为32while (hashString.length( < 32)hashString = "0" + hashString;}return hashString;} catch (NoSuchAlgorithmException e)e.printStackTrace(;return null;}}```在上面的示例代码中,首先定义了一个`getMD5Hash`方法,用于计算输入字符串的MD5散列值。

java学习-sha1散列算法

java学习-sha1散列算法
ic String toHex(byte[] bytes) { StringBuilder ret = new StringBuilder(bytes.length * 2); for (int i=0; i<bytes.length; i++) { ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]); ret.append(HEX_DIGITS[bytes[i] & 0x0f]); } return ret.toString();
public class HashKit { private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();
public static String sha1(String srcStr){ return hash("SHA-1", srcStr);
}
public static String hash(String algorithm, String srcStr) { try { MessageDigest md = MessageDigest.getInstance(algorithm); byte[] bytes = md.digest(srcStr.getBytes("utf-8")); return toHex(bytes); } catch (Exception e) { throw new RuntimeException(e); }
而md5散列算法生成的字节数是128字节长度返回的16进制的字符长度是32位
java学习 -sha1散列算法

MD哈希算法实例

MD哈希算法实例

MD哈希算法实例MD哈希算法是一种常用的密码散列函数,可以将任意长度的数据映射为固定长度的哈希值。

本文将介绍MD哈希算法的原理和实例应用。

一、MD哈希算法原理MD哈希算法是由美国密码学家Ronald Rivest于1992年提出的,目前已经发展到MD5、MD4、MD3等各个版本。

它的原理主要包括两个步骤:填充和压缩。

在填充阶段,MD哈希算法会对输入的数据进行填充,使其长度满足一定的条件。

然后,在压缩阶段,MD算法会通过使用位操作、循环和逻辑函数等运算来对填充后的数据进行处理,最终生成固定长度的哈希值。

二、MD哈希算法实例下面以MD5算法为例,介绍一下MD哈希算法的实例应用。

1. 导入库文件要使用MD5算法,首先需要导入相应的库文件。

在C语言中,可以通过#include <openssl/md5.h>来导入openssl库文件。

2. 定义变量在使用MD5算法前,需要定义一个存储结果的变量。

在C语言中,可以使用unsigned char类型的数组来存储MD5结果。

3. 初始化MD5上下文在调用MD5函数之前,需要初始化MD5上下文。

可以通过调用MD5_Init函数来实现。

4. 输入数据使用MD5算法时,需要输入待计算哈希值的数据。

可以通过调用MD5_Update函数来输入数据。

该函数可以多次调用,输入的数据会被连续处理。

5. 计算哈希值当输入完所有数据后,可以调用MD5_Final函数来计算MD5哈希值。

该函数会将计算得到的哈希值存储在之前定义的变量中。

6. 输出结果最后,可以将计算得到的MD5哈希值进行输出。

在C语言中,可以通过遍历MD5结果数组,将每个字节以十六进制形式输出。

三、MD哈希算法的应用MD哈希算法在密码学、数据完整性校验等领域有着广泛的应用。

1. 密码存储常常在用户注册、登录等场景中需要对密码进行存储和验证。

使用MD哈希算法可以将密码进行哈希处理,并将哈希值存储到数据库中。

md5sum用法

md5sum用法

md5sum用法
md5sum(Message Digest Algorithm 5)是一种十六进制散列算法,常用于检验一段数据的完整性或者验证一段数据是否被篡改过。

它能将长度不限的数据转换成固定长度的散列值。

一、md5sum的作用
1. 数据完整性检验:md5sum可以检查数据的完整性,确认文件在传输过程中没有被破坏、篡改。

2. 数据验证:确认数据是否被篡改,如果篡改了,原来的md5值会变化。

3. 文件去重:在处理大量数据时,可以用md5sum快速判断文件是否重复。

二、md5sum使用方法
1. 用命令行调用md5sum:在终端输入如下命令可以计算文件的md5值:md5sum [文件名] 。

2. 通过脚本调用md5sum:用户可以在脚本中使用md5sum命令进行检验,如果发现数据篡改,可以有适当的响应。

3. 使用工具生成md5sum:用户也可以使用md5sum工具生成文件的md5值,这样操作比较简单,不需要使用命令行命令即可完成md5sum。

总之,md5sum是用于校验数据文件完整性及验证是否被篡改的一种十六进制散列算法,常用的操作有使用命令行调用md5sum,通过脚本调用md5sum,使用工具生成md5sum等。

哈希算法的代码实现

哈希算法的代码实现

哈希算法的代码实现一、什么是哈希算法?哈希算法,又称散列函数,是一种将任意长度的数据映射为固定长度散列值(哈希值)的算法。

这个哈希值通常用于数据的索引或作为数据的数字指纹,具有以下特点:1.输入数据的散列值是固定长度的,不论输入的数据有多长。

2.相同的输入数据一定得到相同的哈希值。

3.不同的输入数据得到的哈希值相对于输入数据的细微改动是完全不同的。

哈希算法广泛应用于密码学、数据完整性检查、信息检索等领域。

二、常见的哈希算法2.1 MD5MD5算法是一种常见的哈希算法,它将数据映射为128位的哈希值。

由于MD5算法易受到碰撞、预计算等攻击方式的影响,现已不推荐在密码学领域使用。

2.2 SHA-1SHA-1算法将数据映射为160位的哈希值,它是MD5的改进版本。

然而,SHA-1算法也存在碰撞攻击的风险,不再被广泛使用。

2.3 SHA-2SHA-2算法族包括SHA-224、SHA-256、SHA-384、SHA-512等哈希算法。

它们的哈希值长度分别为224、256、384、512位,并且相较于MD5和SHA-1,SHA-2算法具有更高的安全性和抗碰撞能力。

2.4 SHA-3SHA-3是最新的哈希算法标准,它具有较高的计算效率和强大的安全性。

SHA-3算法提供了多种哈希函数,包括SHA3-224、SHA3-256、SHA3-384、SHA3-512等。

三、哈希算法的实现原理哈希算法的实现原理可以分为以下几个步骤:1.初始化变量和常数:根据具体的哈希算法,初始化相关的变量和常数。

2.数据填充:根据具体的哈希算法,将输入的数据按照一定的规则进行填充,使得数据长度满足特定要求。

3.数据划分:将填充后的数据划分为若干个块,每个块含有固定的比特数。

4.哈希计算:根据具体的哈希算法,对每个块进行哈希计算。

5.输出结果:将所有块的哈希计算结果合并得到最终的哈希值。

四、哈希算法的代码实现下面是使用Python语言实现SHA-256算法的示例代码:import hashlibdef sha256_hash(data):sha256 = hashlib.sha256()sha256.update(data)return sha256.hexdigest()# 测试代码data = b'Hello, World!'hash_value = sha256_hash(data)print('SHA-256:', hash_value)五、哈希算法的应用哈希算法在实际应用中具有广泛的用途:1.数据完整性校验:通过计算数据的哈希值,可以对数据进行完整性校验。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

package com.md5;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Demo {
public static String encode(String input) throws NoSuchAlgorithmException {
// 加密工具类对象
MessageDigest md = MessageDigest.getInstance("md5");
// 传入目标字符串
md.update(input.getBytes());
// 执行加密
byte[] b = md.digest();
StringBuffer sb = new StringBuffer();
// 把产生的字节数组转换为16进制32位的字符串
for (byte c : b) {
sb.append(Character.forDigit((c >> 4) & 0xf, 16));
sb.append(Character.forDigit(c & 0xf, 16));
}
return sb.toString();
}
public static void main(String[] args) {
try {
String str = encode("进口货数据库的浪费和数据库了东方红说了句孔得红数据库东方红收快递费上课讲的粉红色款交电话费数据库了和卡说句话的法卡死了的进口量和斯柯达将粉红色");
System.out.println(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
作者:武汉宏鹏()教员余老师。

相关文档
最新文档