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加密及解密的代码实例分享基础: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带盐值的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
java实现计算MD5 import java.io.FileInputStream;import java.security.DigestInputStream;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Class {// 计算字符串的MD5public static String conVertTextToMD5(String plainText) {try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(plainText.getBytes());byte b[] = md.digest();int i;StringBuffer buf = new StringBuffer("");for (int offset = 0; offset < b.length; offset++) {i = b[offset];if (i < 0)i += 256;if (i < 16)buf.append("0");buf.append(Integer.toHexString(i));}// 32位加密return buf.toString();// 16位的加密// return buf.toString().substring(8, 24);} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}} //计算⽂件的MD5,⽀持4G⼀下的⽂件(⽂件亲测,⼤⽂件未亲测)public static String conVertFileToMD5(String inputFilePath) {int bufferSize = 256 * 1024;FileInputStream fileInputStream = null;DigestInputStream digestInputStream = null;try {// 拿到⼀个MD5转换器(同样,这⾥可以换成SHA1)MessageDigest messageDigest = MessageDigest.getInstance("MD5");// 使⽤DigestInputStreamfileInputStream = new FileInputStream(inputFilePath);digestInputStream = new DigestInputStream(fileInputStream,messageDigest);// read的过程中进⾏MD5处理,直到读完⽂件byte[] buffer = new byte[bufferSize];while (digestInputStream.read(buffer) > 0);// 获取最终的MessageDigestmessageDigest = digestInputStream.getMessageDigest();// 拿到结果,也是字节数组,包含16个元素byte[] resultByteArray = messageDigest.digest();// 同样,把字节数组转换成字符串return byteArrayToHex(resultByteArray);} catch (Exception e) {return null;} finally {try {digestInputStream.close();} catch (Exception e) {}try {fileInputStream.close();} catch (Exception e) {}}}private static String byteArrayToHex(byte[] byteArray) {// ⾸先初始化⼀个字符数组,⽤来存放每个16进制字符char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };// new⼀个字符数组,这个就是⽤来组成结果字符串的(解释⼀下:⼀个byte是⼋位⼆进制,也就是2位⼗六进制字符(2的8次⽅等于16的2次⽅))char[] resultCharArray = new char[byteArray.length * 2];// 遍历字节数组,通过位运算(位运算效率⾼),转换成字符放到字符数组中去int index = 0;for (byte b : byteArray) {resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];resultCharArray[index++] = hexDigits[b & 0xf];}// 字符数组组合成字符串返回return new String(resultCharArray);}public static void main(String[] args) {// 测试System.out.println(MD5Class.conVertTextToMD5("hello"));System.out.println(conVertFileToMD5("C:\\Users\\administrator1\\Downloads\\StarUML-v2.8.0.msi"));}}。
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 获取文件的哈希值算法
java 获取文件的哈希值算法在Java中,获取文件的哈希值通常使用MD5或SHA-1算法。
以下是一个使用Java实现的获取文件MD5哈希值的示例:```javaimport java.io.File;import java.io.FileInputStream;import java.math.BigInteger;import java.nio.MappedByteBuffer;public class FileHash {public static void main(String[] args) {File file = new File("your_file_path");String md5Hash = getFileMD5Hash(file);System.out.println("文件MD5哈希值:" + md5Hash);}public static String getFileMD5Hash(File file) {try {FileInputStream fis = new FileInputStream(file);MappedByteBuffer buffer =fis.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());BigInteger sum = new BigInteger(1, buffer.array());buffer.clear();return sum.toString(16).toUpperCase();} catch (Exception e) {e.printStackTrace();return null;}}}```这个示例中,我们首先创建一个`File`对象,然后使用`FileInputStream`读取文件内容。
接着,我们使用`MappedByteBuffer`将文件内容存储在内存中,并计算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解密算法-JAVA算法实现
'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++) {
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及简单实现实例概要: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)。
JAVA中获取文件MD5值的四种方法
JAVA中获取⽂件MD5值的四种⽅法 JAVA中获取⽂件MD5值的四种⽅法其实都很类似,因为核⼼都是通过JAVA⾃带的MessageDigest类来实现。
获取⽂件MD5值主要分为三个步骤,第⼀步获取⽂件的byte信息,第⼆步通过MessageDigest类进⾏MD5加密,第三步转换成16进制的MD5码值。
⼏种⽅法的不同点主要在第⼀步和第三步上。
具体可以看下⾯的例⼦:⽅法⼀、1 private final static String[] strHex = { "0", "1", "2", "3", "4", "5",2 "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };34 public static String getMD5One(String path) {5 StringBuffer sb = new StringBuffer();6 try {7 MessageDigest md = MessageDigest.getInstance("MD5");8 byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));9 for (int i = 0; i < b.length; i++) {10 int d = b[i];11 if (d < 0) {12 d += 256;13 }14 int d1 = d / 16;15 int d2 = d % 16;16 sb.append(strHex[d1] + strHex[d2]);17 }18 } catch (NoSuchAlgorithmException e) {19 e.printStackTrace();20 } catch (IOException e) {21 e.printStackTrace();22 }23 return sb.toString();24 } ⽅法⼀是⽐较原始的⼀种实现⽅法,⾸先将⽂件⼀次性读⼊内存,然后通过MessageDigest进⾏MD5加密,最后再⼿动将其转换为16进制的MD5值。
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方法是一种常见的数据加密方式,它能够将任意长度的数据转换为固定长度的字符串。
在本文中,我们将详细介绍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提供的辅助类进行转换。
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校验码及算法实现MD5是一种常用的消息摘要算法,用于验证数据完整性和生成校验码。
在Java中,可以使用`java.security.MessageDigest`类来实现MD5算法,以下是实现MD5算法的步骤和代码示例。
步骤1:获取MessageDigest实例首先,需要获取`MessageDigest`类的实例来计算MD5摘要。
可以通过`getInstance`方法传入算法名称来获取实例。
MD5算法的算法名称为"MD5"。
```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Generatorpublic static void main(String[] args)try// 获取MD5的MessageDigest实例MessageDigest md = MessageDigest.getInstance("MD5");//执行后续操作} catch (NoSuchAlgorithmException e)e.printStackTrace(;}}```步骤2:计算MD5摘要接下来,可以使用`MessageDigest`实例的`digest`方法计算MD5摘要。
该方法接受一个字节数组作为输入,并返回一个计算好的摘要值的字节数组。
```javabyte[] data = "Hello, World!".getBytes(;byte[] digest = md.digest(data);```步骤3:转换为十六进制字符串MD5摘要通常以十六进制字符串的形式表示。
可以使用以下代码将摘要值转换为十六进制字符串。
```javaStringBuilder sb = new StringBuilder(;for (byte b : digest)String hex = Integer.toHexString(b & 0xff);if (hex.length( == 1)sb.append("0");}sb.append(hex);String md5 = sb.toString(;System.out.println("MD5: " + md5);```步骤4(可选):使用Base64编码生成校验码如果需要以可读的方式展示校验码(例如作为字符串),可以使用Base64编码对摘要值进行编码。
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 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC)本文转自网络消息摘要消息摘要(Message Digest)又称为数字摘要(Digital Digest)。
它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。
如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。
因此消息摘要保证了消息的完整性。
消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。
这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。
HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。
而HASH算法的单向性使得要找到到哈希值相同的两个不同的输入消息,在计算上是不可能的。
所以数据的哈希值,即消息摘要,可以检验数据的完整性。
哈希函数的这种对不同的输入能够生成不同的值的特性使得无法找到两个具有相同哈希值的输入。
因此,如果两个文档经哈希转换后成为相同的值,就可以肯定它们是同一文档。
所以,当希望有效地比较两个数据块时,就可以比较它们的哈希值。
例如,可以通过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改。
消息摘要算法消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用。
由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的。
近年来,随着计算机相同性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加。
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加密。
做项⽬时,某些模块添加加密功能可以提⾼⽤户个⼈信息安全性,防⽌信息泄露,其中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);}}加密解密的⽅法同样是静态⽅法,直接类名.⽅法名调⽤即可。
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
*/
public String compute()
{
// convert input String to a char[]
// convert that char[] to byte[]
{
System.out.println(e.toString());
e.printStackTrace();
}
}
/**
* Computes the MD5 fingerprint of a string.
*
System.out.println(postString);
if(postString.equals("900150983cd24fb0d6963f7d28e17f72"))
{
System.out.println("true");
}
}
return hexValue.toString();
}
public static void main(String[] args)
{
MD5 md5=new MD5("abc");
String postString = pute();
for (int i=0; i<md5Bytes.length; i++)
{
int val = ((int) md5Bytes[i] ) & 0xff;
if (val < 16) hexValue.append("0");
hexValue.append(Integer.toHexString(val));
*/
public MD5(String inStr)
{
this.inStr = inStr;
try
{
this.md5 = MessageDigest.getInstance("MD5");
}
catch (Exception e)
else
System.out.println("false");
}
}
�
// get the md5 digest as byte[]
// bit-wise AND that byte[] with 0xff
// prepend "0" to the output StringBuffer to make sure that we don't end up with
private MessageDigeucts the MD5 object and sets the string whose MD5 is to be computed.
*
* @param inStr the <code>String</code> whose MD5 is to be computed
java实现MD5算法
关键词: java MD5
import java.security.*;
import java.util.*;
/**
*
*/
public class MD5
{
private String inStr;
for (int i=0; i<charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = this.md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
// something like "e21ff" instead of "e201ff"
char[] charArray = this.inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];