MD5解密算法-JAVA算法实现

合集下载

java 密码加密解密方法

java 密码加密解密方法

java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。

其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。

一种常见的密码加密方法是使用MessageDigest类进行加密。

这可以通过以下步骤实现:首先,将密码转换为字节数组。

然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。

接下来,使用update方法将密码的字节数组传递给MessageDigest实例。

最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。

另一种常见的方法是使用对称加密算法,例如AES或DES。

这些算法使用相同的密钥进行加密和解密。

在Java中,可以使用javax.crypto包中的类来实现对称加密。

通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。

此外,还可以使用非对称加密算法,例如RSA。

这种方法使用公钥对数据进行加密,然后使用私钥进行解密。

在Java中,可以使用java.security包中的类来实现非对称加密。

无论使用哪种方法,都需要注意密码安全的问题。

例如,密钥的安全存储和管理,以及密码传输过程中的安全性。

另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。

总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。

希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。

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加密⼯具:。

java 标准md5算法

java 标准md5算法

java 标准md5算法
Java标准MD5算法是一种用于生成消息摘要的加密算法。

它将
任意长度的消息作为输入,输出固定长度的哈希值。

MD5 算法是一种不可逆的加密方式,即无法通过哈希值逆推出原始的输入信息。

在 Java 中,使用 java.security.MessageDigest 类来实现
MD5 算法。

具体步骤如下:
1. 创建 MessageDigest 对象,指定算法类型为 'MD5'。

2. 将需要加密的字符串转换为字节数组。

3. 调用 MessageDigest 对象的 update() 方法,传入字节数组参数,更新摘要。

4. 调用 MessageDigest 对象的 digest() 方法,生成摘要结果,即 MD5 哈希值。

生成的哈希值为 16个字节的二进制数组,可以通过将其转换为十六进制字符串来进行展示。

需要注意的是,MD5 算法虽然具有很高的加密性,但由于其单向性,也容易被暴力破解或碰撞攻击。

因此,在实际应用中,需要对 MD5 哈希值进行加盐处理或者使用更加复杂的加密算法来提高安全性。

- 1 -。

java中的md5用法

java中的md5用法

java中的md5用法Java中的MD5用法什么是MD5MD5是一种常见的哈希算法,用于对任意长度的数据进行加密。

它可以将任意长度的数据转化为定长的128位(16字节)哈希值。

使用场景MD5主要用于密码存储、数据完整性校验、数字签名等场景。

使用步骤1.导入类:import ;2.创建MD5对象:MessageDigest md = ("MD5");此处也可以使用其他哈希算法,如”SHA-1”等。

3.将要加密的数据转换为字节数组:String data = "Hello, World!";byte[] dataBytes = ();4.将字节数组更新到MD5对象中:(dataBytes);5.计算MD5的哈希值:byte[] md5Bytes = ();6.将MD5的哈希值转化为字符串表示:StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {(("%02x", b & 0xff));}String md5 = ();通过上述步骤,我们即可得到原始数据的MD5加密结果。

实际应用密码存储在用户注册或登录时,常常需要对用户输入的密码进行加密后才能进行存储或验证。

以下是一个示例代码:public static String getMD5(String data) {String md5 = null;try {MessageDigest md = ("MD5");byte[] dataBytes = ();(dataBytes);byte[] md5Bytes = ();StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {(("%02x", b & 0xff));}md5 = ();} catch (Exception e) {();}return md5;}在注册时,可以将用户输入的密码使用上述方法加密后存储到数据库中。

加密系列MD5加密和解密算法详解代码示例

加密系列MD5加密和解密算法详解代码示例

加密系列MD5加密和解密算法详解代码示例MD5加密算法是一种广泛应用的密码加密算法,它将任意长度的数据映射为固定长度的128位哈希值。

MD5加密算法是不可逆的,即通过密文无法还原得到原始数据。

MD5加密算法的实现可以通过编写代码来完成。

下面是一个示例的MD5加密算法的代码:```import hashlibdef md5_encrypt(data):md5 = hashlib.md5md5.update(data.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':data = input("请输入需要加密的数据:")encrypted_data = md5_encrypt(data)print("加密结果为:", encrypted_data)```以上代码实现了一个简单的MD5加密算法。

首先导入了`hashlib`模块,该模块提供了一系列用于数据加密的算法,包括MD5算法。

`md5_encrypt`函数接收一个字符串作为输入数据,并将其转换为字节流形式,然后使用`hashlib.md5`方法创建了一个MD5对象。

接着,通过调用MD5对象的`update`方法将输入数据添加到加密流程中。

最后,通过调用MD5对象的`hexdigest`方法获得加密后的结果,并将其返回。

在`if __name__ == '__main__'`下方的代码段中,首先获取用户输入的数据,然后调用`md5_encrypt`函数对其进行加密,并将结果打印到控制台。

下面是MD5解密算法的示例代码:```import hashlibdef md5_decrypt(encrypted_data):md5 = hashlib.md5md5.update(encrypted_data.encode('utf-8'))return md5.hexdigestif __name__ == '__main__':encrypted_data = input("请输入需要解密的数据:")decrypted_data = md5_decrypt(encrypted_data)print("解密结果为:", decrypted_data)```以上代码实现了一个简单的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)。

javamd5解密函数

javamd5解密函数

javamd5解密函数Java中提供了一个MD5加密算法,用于对数据进行加密和解密。

MD5(Message Digest Algorithm 5)是一种不可逆的加密算法,它将任意长度的数据映射成一个固定长度的128位哈希值。

在本文中,我们将一步一步介绍如何使用Java实现MD5解密函数。

第一步是导入Java的MessageDigest和BigInteger类。

MessageDigest类是Java中提供的加密功能的核心类,它支持多种加密算法,包括MD5。

BigInteger类用于处理大整数运算,我们将在后面的步骤中用它来将加密结果转换为可读的字符串。

javaimport java.security.MessageDigest;import java.math.BigInteger;接下来,我们定义一个名为md5Decrypt的函数,该函数接收一个字符串参数,并返回解密后的结果。

javapublic static String md5Decrypt(String input) {try {创建一个MD5的MessageDigest对象MessageDigest md = MessageDigest.getInstance("MD5");使用指定的字符串更新摘要md.update(input.getBytes());获取摘要结果byte[] digest = md.digest();将结果转换为BigInteger类型BigInteger bigInt = new BigInteger(1, digest);将结果转换为可读的字符串String decrypted = bigInt.toString(16);补0while (decrypted.length() < 32) {decrypted = "0" + decrypted;}return decrypted;} catch (Exception e) {e.printStackTrace();return null;}}在函数中,我们首先创建一个MD5的MessageDigest对象。

java的md5util.encodemd5string方法

java的md5util.encodemd5string方法

java的md5util.encodemd5string方法Java的MD5Util.encodeMD5String方法是一种常见的加密方法,用于将任意长度的字符串转化成固定长度的MD5值。

在本文中,我们将一步一步地回答有关这个方法的问题,从而全面地了解它的使用和原理。

1. 什么是MD5?MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,常用于对密码或其他敏感信息进行加密。

它产生一个唯一的128位(32个字符)MD5值,不同的输入会产生不同的输出,且无法从MD5值反推出原始数据。

2. 什么是加密方法?加密是一种将数据转化为不可读的密文的过程,以保护数据的安全性。

而加密方法则指用于执行加密操作的算法或函数。

3. MD5Util.encodeMD5String方法的作用是什么?MD5Util.encodeMD5String方法用于将字符串转化为MD5值。

通过将用户输入的字符串进行哈希处理,可以将其变为不可逆的MD5值。

这样一来,即使有人获取了MD5值,也无法从中获取原始数据。

4. 这个方法的使用步骤是什么?使用MD5Util.encodeMD5String方法有以下几个步骤:- 导入MD5Util类。

- 创建一个字符串变量,用来存储需要加密的字符串。

- 调用MD5Util.encodeMD5String方法并传入需要加密的字符串作为参数。

- 获取返回的MD5值并进行后续操作,如存储、比较等。

5. encodeMD5String方法的参数和返回值是什么?encodeMD5String方法的参数是一个字符串类型的明文数据。

它返回一个字符串类型的MD5值,即将明文数据转化后的加密结果。

6. 如何导入MD5Util类?要使用MD5Util类,首先需要确保该类已存在于项目中。

如果该类来自于外部库或框架,则需要先在项目的构建路径中导入相关的依赖。

然后,在Java代码的开头导入MD5Util类。

java中常用的md5方法 -回复

java中常用的md5方法 -回复

java中常用的md5方法-回复Java中常用的MD5方法是一种常见的数据加密方式,它能够将任意长度的数据转换为固定长度的字符串。

在本文中,我们将详细介绍MD5的基本概念、原理,以及在Java中如何使用MD5方法实现数据加密。

第一部分:MD5的基本概念与原理(300-500字)MD5(Message Digest Algorithm 5)是一种广泛使用的哈希算法,由Ron Rivest于1991年设计。

MD5算法将任意长度的输入数据通过一系列步骤转换为128位长度的输出字符串。

其具体的转换过程由四轮循环操作组成,其中每轮包括四个步骤:填充、划分、压缩和输出。

通过这些操作,MD5算法能够保证输出的唯一性和不可逆性,即无法从MD5值还原出原始数据。

第二部分:Java中的MD5方法(600-1000字)Java提供了多种方法来实现MD5加密,下面我们一步一步详细介绍如何在Java中使用MD5方法。

步骤一:导入相关的类库在使用MD5方法之前,需要导入Java提供的相关类库。

在Java中,可以使用java.security.MessageDigest类来进行MD5加密操作。

因此,需要在代码的开头导入该类。

javaimport java.security.MessageDigest;步骤二:创建MD5加密方法在Java中,可以通过调用java.security.MessageDigest类的getInstance方法来获取MD5加密实例。

javaMessageDigest md = MessageDigest.getInstance("MD5");步骤三:传入待加密的数据调用md实例的update方法,将待加密的数据传入。

在md实例中,可以通过调用digest方法获取加密后的数据。

需要注意的是,MD5加密后的数据是以字节数组的形式存储的。

javamd.update(data.getBytes());byte[] encryptedData = md.digest();步骤四:转换为字符串形式将字节数组形式的加密数据转换为字符串形式,可以使用Java提供的辅助类进行转换。

BASE64,MD5,SHA,HMAC加密與解密算法(java)

BASE64,MD5,SHA,HMAC加密與解密算法(java)

BASE64,MD5,SHA,HMAC加密與解密算法(java) 1package com.ice.webos.util.security;23import java.io.UnsupportedEncodingException;4import java.math.BigInteger;5import java.security.Key;6import java.security.MessageDigest;7import java.security.SecureRandom;89import javax.crypto.Cipher;10import javax.crypto.KeyGenerator;11import javax.crypto.Mac;12import javax.crypto.SecretKey;13import javax.crypto.SecretKeyFactory;14import javax.crypto.spec.DESKeySpec;15import javax.crypto.spec.SecretKeySpec;1617import sun.misc.BASE64Decoder;18import sun.misc.BASE64Encoder;1920/**21 * <ul>22 * <li>BASE64的加密解密是双向的,可以求反解。

</li>23 * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产⽣唯⼀的⼀个加密串,通常⽤来校验数据在传输过程中是否被修改。

</li>24 * <li>HMAC算法有⼀个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。

</li>25 * <li>DES DES-Data Encryption Standard,即数据加密算法。

java加密解密算法MD5SHA1,DSA

java加密解密算法MD5SHA1,DSA

java加密解密算法MD5SHA1,DSA通常,使⽤的加密算法⽐较简便⾼效,密钥简短,加解密速度快,破译极其困难。

本⽂介绍了MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使⽤。

第1章基础知识1.1. 单钥密码体制单钥密码体制是⼀种传统的加密,是指信息的发送⽅和接收⽅共同使⽤同⼀把密钥进⾏加解密。

通常,使⽤的加密算法⽐较简便⾼效,密钥简短,加解密速度快,破译极其困难。

但是加密的安全性依靠密钥保管的安全性,在公开的上安全地传送和保管密钥是⼀个严峻的问题,并且如果在多⽤户的情况下密钥的保管安全性也是⼀个问题。

单钥密码体制的代表是美国的DES1.2. 消息摘要⼀个消息摘要就是⼀个数据块的数字指纹。

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

消息摘要有两个基本属性:两个不同的报⽂难以⽣成相同的摘要难以对指定的摘要⽣成⼀个报⽂,⽽由该报⽂反推算出该指定的摘要代表:美国国家标准技术研究所的SHA1和⿇省理⼯学院Ronald Rivest提出的MD51.3. Diffie-Hellman密钥⼀致协议密钥⼀致协议是由公开密钥密码体制的奠基⼈Diffie和Hellman所提出的⼀种思想。

先决条件,允许两名⽤户在公开媒体上交换信息以⽣成"⼀致"的,可以共享的密钥代表:指数密钥⼀致协议(Exponential Key Agreement Protocol)1.4. ⾮对称算法与公钥体系1976 年,Dittie和Hellman为解决密钥管理问题,在他们的奠基性的⼯作"密码学的新⽅向"⼀⽂中,提出⼀种密钥交换协议,允许在不安全的媒体上通过通讯双⽅交换信息,安全地传送秘密密钥。

在此新思想的基础上,很快出现了⾮对称密钥密码体制,即公钥密码体制。

在公钥体制中,加密密钥不同于解密密钥,加密密钥公之于众,谁都可以使⽤;解密密钥只有解密⼈⾃⼰知道。

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 进制表示即可。

代码如下:package com.tsinghua;/*** MD5的算法在RFC1321 中定义* 在RFC 1321中,给出了Test suite用来检验你的实现是否正确:* MD5 ("") = d41d8cd98f00b204e9800998ecf8427e* MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661* MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72* MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0* MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b** @author haogj** 传入参数:一个字节数组* 传出参数:字节数组的MD5 结果字符串*/public class MD5 {public static String getMD5(byte[] source) {String s = null;char hexDigits[] = { // 用来将字节转换成16 进制表示的字符'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};try{java.security.MessageDigest md = java.security.MessageDigest.getInstance( "MD5" );md.update( source );byte tmp[] = md.digest(); // MD5 的计算结果是一个128 位的长整数,// 用字节表示就是16 个字节char str[] = new char[16 * 2]; // 每个字节用16 进制表示的话,使用两个字符,// 所以表示成16 进制需要32 个字符int k = 0; // 表示转换结果中对应的字符位置for (int i = 0; i < 16; i++) { // 从第一个字节开始,对MD5 的每一个字节 // 转换成16 进制字符的转换byte byte0 = tmp[i]; // 取第i 个字节str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高4 位的数字转换,// >>> 为逻辑右移,将符号位一起右移str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低4 位的数字转换}s = new String(str); // 换后的结果转换为字符串}catch( Exception e ){e.printStackTrace();}return s;}}测试代码如下:import com.tsinghua.*;public class TestMD5{public static void main( String xu[] ){ // 计算"a" 的MD5 代码,应该为:0cc175b9c0f1b6a831c399e269772661 System.out.println( MD5.getMD5("a".getBytes()) );}}。

MD5加盐Java加密算法

MD5加盐Java加密算法

MD5加盐Java加密算法import java.security.MessageDigest;public class PasswordEncoder {private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };private Object salt;private String algorithm;public PasswordEncoder(Object salt, String algorithm) {this.salt = salt;this.algorithm = algorithm;}public String encode(String rawPass) {String result = null;try {MessageDigest md = MessageDigest.getInstance(algorithm);//加密后的字符串result = byteArrayToHexString(md.digest(mergePasswordAndSalt(rawPass).getBytes("utf-8")));} catch (Exception ex) {}return result;}public boolean isPasswordValid(String encPass, String rawPass) {String pass1 = "" + encPass;String pass2 = encode(rawPass);return pass1.equals(pass2);}private String mergePasswordAndSalt(String password) {if (password == null) {password = "";}if ((salt == null) || "".equals(salt)) {return password;} else {return password + "{" + salt.toString() + "}";}}/*** 转换字节数组为16进制字串* @param b 字节数组* @return 16进制字串*/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];}public static void main(String[] args) {String salt = "helloworld";PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5");String encode = encoderMd5.encode("test");System.out.println(encode);boolean passwordValid = encoderMd5.isPasswordValid("1bd98ed329aebc7b2f89424b5a38926e", "test"); System.out.println(passwordValid);PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA");String pass2 = encoderSha.encode("test");System.out.println(pass2);boolean passwordValid2 = encoderSha.isPasswordValid("1bd98ed329aebc7b2f89424b5a38926e", "test"); System.out.println(passwordValid2);}}。

Java常见摘要算法——md5、sha1、sha256

Java常见摘要算法——md5、sha1、sha256

Java常见摘要算法——md5、sha1、sha256⽬录实现sha256的代码和sha1的代码相似摘要算法简介 摘要算法,也是加密算法的⼀种,还有另外⼀种叫法:指纹。

摘要算法就是对指定的数据进⾏⼀系列的计算,然后得出⼀个串内容,该内容就是该数据的摘要。

不同的数据产⽣的摘要是不同的,所以,可以⽤它来进⾏⼀些数据加密的⼯作:通过对⽐两个数据加密后的摘要是否相同,来判断这两个数据是否相同。

还可以⽤来保证数据的完整性,常见的软件在发布之后,会同时发布软件的md5和sha值,这个md5和sha值就是软件的摘要。

当⽤户将软件下载之后,然后去计算软件的摘要,如果计算所得的摘要和软件发布⽅提供的摘要相同,则证明下载的软件和发布的软件⼀模⼀样,否则,就是下载过程中数据(软件)被篡改了。

常见的摘要算法包括:md、sha这两类。

md包括md2、md4、md5;sha包括sha1、sha224、sha256、sha384、sha512。

md5 md摘要算法包括多种算法:分别是md2、md4、md5。

现在⼀般都是使⽤md5进⾏加密。

Java中实现md5加密,有三种⽅式: 使⽤jdk内置的⽅法实现实现md5加密package cn.ganlixin.security;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import mons.codec.binary.Hex;public class JdkMD5 {public static void main(String[] args) throws NoSuchAlgorithmException {String plainText = "this is plain text";// 通过调⽤MessageDigest(数据摘要类)的getInstance()静态⽅法,传⼊加密算法的名称,获取数据摘要对象。

Java的MD5盐值加密,Des加密解密和base64加密解密使用方法

Java的MD5盐值加密,Des加密解密和base64加密解密使用方法

Java的MD5盐值加密,Des加密解密和base64加密解密使⽤⽅法java⽀持md5盐值加密和des加密。

做项⽬时,某些模块添加加密功能可以提⾼⽤户个⼈信息安全性,防⽌信息泄露,其中des⽀持加密解密,MD5⽬前只⽀持加密(多⽤于⽤户登录密码验证,所以⽆需解密展⽰)。

⼀、MD5盐值加密1.在pom⽂件中导⼊相关jar包<dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.3.2</version></dependency>2.编写MD5类import org.apache.shiro.crypto.hash.SimpleHash;/*** 加密⼯具类* @author john**/public class MD5 {//加密类型private static String hashName="MD5";//加密次数private static int hashNum=1024;//pwd是需要加密的字符,salt是盐值(⾃定义),hashNum是加密次数,次数越多越安全public static Object getMD5(String pwd,String salt){Object obj=new SimpleHash(hashName, pwd, salt, hashNum);return obj;}}加密⽅法是静态⽅法,使⽤时直接MD5.getMD5(pwd,salt).toString();即可。

暂⽆解密⽅法。

⼆、Base64加密1.同样第⼀步也是导⼊base相关jar包<!-- Base64 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.14</version></dependency>2.编写base64类import mons.codec.binary.Base64;public class Base64Utils {/*** 加密** @param plainText* @return*/public static String encodeStr(String plainText) {byte[] b = plainText.getBytes();Base64 base64 = new Base64();b = base64.encode(b);return new String(b);}/*** 解密** @param encodeStr* @return*/public static String decodeStr(String encodeStr) {byte[] b = encodeStr.getBytes();Base64 base64 = new Base64();b = base64.decode(b);return new String(b);}}加密解密的⽅法同样是静态⽅法,直接类名.⽅法名调⽤即可。

java密码加密方法

java密码加密方法

java密码加密方法在现今的网络世界中,安全性是非常重要的一个问题,其中密码的安全性就尤为重要。

许多网站和应用程序都需要用户进行登录,需要输入用户名和密码来验证身份。

但是,用户往往习惯使用简单的密码,如生日、常用英文单词等。

这使得密码的安全性降低了很多,给黑客攻击、身份盗窃等带来了很大的风险。

为了提高密码安全性,需要对密码进行加密。

Java是一种非常流行的编程语言之一,有许多加密方法可以用来加密密码。

本文将介绍Java密码加密的几种方法。

1.MD5加密算法MD5是最常见的一种密码加密算法之一。

它可以将一个明文字符串加密成一个128位的哈希值,通常用32位的十六进制数字表示。

MD5被广泛使用,因为它是一个不可逆的算法,使用同样的密码加密出来的哈希值是唯一的,且不可反向推导出原始字符串。

以下是MD5加密的Java代码示例:```import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;StringBuffer sb = new StringBuffer();for (int i = 0; i < b.length; i++) {int v = b[i] & 0xFF;if (v < 16) {sb.append("0");}sb.append(Integer.toHexString(v));}return sb.toString();}在以上代码中,toMD5方法接受一个明文字符串,返回一个MD5哈希串,可以在一个数据库中保存。

在登陆时,将用户输入的密码进行MD5加密,然后和数据库中的加密串比较,若相等则表示输入的密码是正确的。

需要注意的是,MD5算法虽然被广泛使用,但是安全性并不是十分高,因为它在被攻击时容易被破解。

因此,在一些敏感性较高的场合下,建议使用更加复杂的加密算法,如SHA-1、SHA-256等。

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;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V', 'W', 'X', 'Y', 'Z', ',', '.', '/', ';', '\'', ':', '"',
// 把这个认为我要找到的经过加密的密码
System.out.println("密码破测试中!");
System.out.println("明文是:" + password);
System.out.println("密文是:" + md5Password);
System.out.println("程序时间计时器!");
for (int c = 0; c < code.length; c++) {
testPassword = testPassword.substring(0, 2);
testPassword += code[c];
for (int d = 0; d < code.length; d++) {
* @author great*/
public class MD5解密 {
private static final char code[] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
}
}
}
}
}
}
/**
* 七位密码破解,写法详见六位密码破解
*/
public static void Md5_7(String md5Password) {
}
/**
* 八位密码破解,写法详见六位密码破解
*/
public static void Md5_8(String md5Password) {
在网络中MD5是著名的不可逆算法,但是如果知道MD5的加密的字符串
则可以通过自己的加密算法对明文进行加密,对加密后的密文与字符串匹配;
匹配成功,表示找到明文;但是此程序的时间耗费较高!仅提供一个解密的方法!
package md5;
import java.util.Date;
/**
/**
* 六位密码破解
*/
public static void Md5_6(String md5Password) {
String testPassword;
MD5 md5Obj = new MD5();
String result;
for (int a = 0; a < code.length; a++) {
已经破解!");
System.out.println("明文
是:" + testPassword);
System.out.println("密文
是:" + md5Password);
return;
}
}
}
public static void main(String[] args) {
MD5 md5Obj = new MD5();
// MD5加密对象
String md5Password = md5Obj.getMD5ofStr(password);
4);
testPassword += code[e];
for (int f = 0; f < code.length; f++) {
testPassword =
testPassword.substring(0, 5);
testPassword += code[f];
System.out.println("开始时间:" + new Date());
Md5_6(md5Password);
// 依次调用6位破解到20位破解..
// Md5_7(testResult);
System.out.println("结束时间:" + new Date());
'[', ']', '{', '}', '\\', '|', '!', '@', '#', '$', '%', '^', '&',
'*', '(', ')', '-', '_', '+', '=', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9' };
testPassword = "";
testPassword += code[a];
for (int b = 0; b < code.length; b++) {
testPassword = testPassword.substring(0, 1);
testPassword += code[b];
}
testPassword = testPassword.substring(0, 3);
testPassword += code[d];
for (int e = 0; e < code.length; e++) {
testPassword = testPassword.substring(0,
// System.out.println
(testPassword);
result = md5Obj.getMD5ofStr
(testPassword);
if (md5Password.equals(result)) {
System.out.println("密码
}
private static final String password = "aaa918";
/**
* 这里只是一个实现的方法, 在自己破解的时候把自己的密文直接贴出来,
* 进行破解, 这里只是进行一个aaaBc8加密的测试
*/
private static final String MD5PWD = "你的数据库中的密文";
相关文档
最新文档