实验指导书1_MD5加密的Java实现
java md5 加密原理
java md5 加密原理Java MD5 加密原理:•MD5 是一种常用的数据加密算法,用于确保数据的完整性和安全性。
•在 Java 中,可以使用 MessageDigest 类来实现 MD5 加密算法。
•MessageDigest 类位于 java.security 包中,使用getInstance(“MD5”) 方法来获取 MessageDigest 的实例,再通过 update() 方法将要加密的数据写入 MessageDigest。
最后,调用 digest() 方法获得加密后的数据。
•MD5 加密的原理是通过对原数据进行多次组合和数据填充,然后通过处理数据块的方式生成 128 位的散列值,从而实现数据加密的目的。
•MD5 加密算法是一种单向加密算法,即加密过程无法逆转,只有通过暴力破解的方式进行破解。
•MD5 加密算法并不能保证数据的绝对安全,因为一旦攻击者获得了加密后的散列值,就可以通过字典、暴力破解等方式进行破解。
•因此,在实际应用中,为了保证数据的安全性,还需要采用其他的加密算法,如 AES、RSA 等。
总之,Java MD5 加密算法是一种常见的数据加密方式,采用多次组合和填充数据的方式生成 128 位散列值,实现数据的单向加密。
但是,如果要确保数据的绝对安全,还需要采用其他的加密算法来保护数据。
以下是 Java MD5 加密的一些特点和应用:•Java MD5 加密算法可以对任何长度的数据进行加密处理,生成固定长度的散列值。
•由于 MD5 加密算法是单向加密算法,因此无法对加密后的散列值进行解密,只能通过暴力破解的方式进行破解。
•在实际应用中,MD5 加密算法常用于密码加密、数字签名、数据完整性校验等方面。
•在密码加密方面,通常是将用户输入的密码进行 MD5 加密后存储在数据库中,比明文存储要更安全。
•由于 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实现
当设置好这四个链接变量后,就开始进入算法的四轮循环运算,循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。主循环有四轮(MD4只有三轮),每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量(文本中的一个子分组和一个常数)。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。以一下是每次操作中用到的四个非线性函数(每轮一个)。
* final是表示了只读,切能在同一个进程空间内的多个Instance间共享
*/
static final int S11 = 7;
static final int S12 = 12;
static final int S13 = 17;
static final int S14 = 22;
static final int S21 = 5;
package encryption;
/**
* md5类实现了RSA Data Security, Inc.在提交给IETF的RFC1321中的MD5 message-digest算法。
**/
public class MD5Util {
/*
*下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define实现的,这里把它们实现成为static
MD5加密原理和Java实现
MD5加密(Java实现图形化界面)
MD5加密(Java实现图形化界面)效果图如下:有三个java类来完成分别为MD5View(视图)、MD5Service(MD5加密)、MD5Main(主方法类)MD5View(视图)package com.md5.view;import java.awt.Container;import java.awt.FlowLayout;import java.awt.GridLayout;import java.awt.Image;import java.awt.Toolkit;import java.awt.datatransfer.Clipboard;import java.awt.datatransfer.StringSelection;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Locale;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JTextField;import com.md5.service.MD5Service;/*** MD5加密图形界面** @author xlfdzhf*/public class MD5View extends JFrame implements Runnable{private static final long serialVersionUID = 1L;private Container container;private JTextField md5Encrypt;private JLabel time;private JTextField md5EncryptedUp32;private JTextField md5EncryptedLow32;private JTextField md5EncryptedUp16;private JTextField md5EncryptedLow16;private MD5Service md5Service;private Clipboard clip=Toolkit.getDefaultToolkit().getSystemClipboard();public MD5View(){JFrame md5=new JFrame("MD5加密");Image md5image = Toolkit.getDefaultToolkit().getImage("image/md5.jpg");md5.setIconImage(md5image);md5.setVisible(true);md5.setLocation(400, 300);md5.setSize(600, 400);md5.setResizable(false);md5.setLayout(new GridLayout(8,1,10,10));md5.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);container=md5.getContentPane();;//标题JPanel md5Panel=new JPanel();md5Panel.setLayout(new FlowLayout(FlowLayout.RIGHT,20,1));JButton clean=new JButton("清空所有内容");JButton trim=new JButton("去掉明文首尾空格");time=new JLabel();clean.addActionListener(new ButtonActionListener()); trim.addActionListener(new ButtonActionListener());md5Panel.add(clean);md5Panel.add(trim);md5Panel.add(time);//明文JPanel inputPanel=new JPanel();inputPanel.setLayout(new FlowLayout());JLabel inputLabel=new JLabel("您请输入明文:");md5Encrypt=new JTextField(30);JButton encrypt=new JButton("使用MD5加密明文"); encrypt.addActionListener(new ButtonActionListener()); inputPanel.add(inputLabel);inputPanel.add(md5Encrypt);inputPanel.add(encrypt);//32位MD5大写JPanel md5Up32Panel=new JPanel();md5Up32Panel.setLayout(new FlowLayout());JLabel md5Up32Label=new JLabel("32位MD5大写:"); md5EncryptedUp32=new JTextField(30);md5EncryptedUp32.setEditable(false);JButton copyUp32=new JButton("复制32位MD5大写"); copyUp32.addActionListener(new ButtonActionListener()); md5Up32Panel.add(md5Up32Label);md5Up32Panel.add(md5EncryptedUp32);md5Up32Panel.add(copyUp32);//32位MD5小写JPanel md5Low32Panel=new JPanel();md5Low32Panel.setLayout(new FlowLayout());JLabel md5Low32Label=new JLabel("32位MD5小写:"); md5EncryptedLow32=new JTextField(30);md5EncryptedLow32.setEditable(false);JButton copyLow32=new JButton("复制32位MD5小写"); copyLow32.addActionListener(new ButtonActionListener()); md5Low32Panel.add(md5Low32Label);md5Low32Panel.add(md5EncryptedLow32);md5Low32Panel.add(copyLow32);//16位MD5大写JPanel md5Up16Panel=new JPanel();md5Up16Panel.setLayout(new FlowLayout());JLabel md5Up16Label=new JLabel("16位MD5大写:");md5EncryptedUp16=new JTextField(30);md5EncryptedUp16.setEditable(false);JButton copyUp16=new JButton("复制16位MD5大写");copyUp16.addActionListener(new ButtonActionListener());md5Up16Panel.add(md5Up16Label);md5Up16Panel.add(md5EncryptedUp16);md5Up16Panel.add(copyUp16);//16位MD5小写JPanel md5Low16Panel=new JPanel();md5Low16Panel.setLayout(new FlowLayout());JLabel md5Low16Label=new JLabel("16位MD5小写:");md5EncryptedLow16=new JTextField(30);md5EncryptedLow16.setEditable(false);JButton copyLow16=new JButton("复制16位MD5小写");copyLow16.addActionListener(new ButtonActionListener());md5Low16Panel.add(md5Low16Label);md5Low16Panel.add(md5EncryptedLow16);md5Low16Panel.add(copyLow16);//版本信息JPanel md5AboutPanel=new JPanel();md5AboutPanel.setLayout(new FlowLayout(FlowLayout.CENTER,20,1));JLabel md5VersionLabel=new JLabel("Version:2013.01.17");JLabel md5AuthorLabel=new JLabel("Author:xlfdzhf");md5AboutPanel.add(md5VersionLabel);md5AboutPanel.add(md5AuthorLabel);container.add(md5Panel);container.add(inputPanel);container.add(md5Up32Panel);container.add(md5Low32Panel);container.add(md5Up16Panel);container.add(md5Low16Panel);container.add(md5AboutPanel);}public class ButtonActionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {JButton button=(JButton)e.getSource();if(button.getActionCommand().equals("清空所有内容")){md5Encrypt.setText("");md5EncryptedUp32.setText("");md5EncryptedLow32.setText("");md5EncryptedUp16.setText("");md5EncryptedLow16.setText("");}else if(button.getActionCommand().equals("去掉明文首尾空格")){md5Encrypt.setText(md5Encrypt.getText().trim());}else if(button.getActionCommand().equals("使用MD5加密明文")){md5Service=new MD5Service(md5Encrypt.getText());md5EncryptedUp32.setText(md5Service.getMd5EncryptedUp32());md5EncryptedLow32.setText(md5Service.getMd5EncryptedLow32());md5EncryptedUp16.setText(md5Service.getMd5EncryptedUp16());md5EncryptedLow16.setText(md5Service.getMd5EncryptedLow16());}else if(button.getActionCommand().equals("复制32位MD5大写")){clip.setContents(new StringSelection(md5EncryptedUp32.getText()), null);JOptionPane.showMessageDialog(container,"已复制到剪贴板!", "系统信息", RMATION_MESSAGE);}else if(button.getActionCommand().equals("复制32位MD5小写")){clip.setContents(new StringSelection(md5EncryptedLow32.getText()), null);JOptionPane.showMessageDialog(container,"已复制到剪贴板!", "系统信息", RMATION_MESSAGE);}else if(button.getActionCommand().equals("复制16位MD5大写")){clip.setContents(new StringSelection(md5EncryptedUp16.getText()), null);JOptionPane.showMessageDialog(container,"已复制到剪贴板!", "系统信息", RMATION_MESSAGE);}else if(button.getActionCommand().equals("复制16位MD5小写")){clip.setContents(new StringSelection(md5EncryptedLow16.getText()), null);JOptionPane.showMessageDialog(container,"已复制到剪贴板!", "系统信息", RMATION_MESSAGE);}}}@Overridepublic void run() {while(true){Date date=new Date();SimpleDateFormat sfm=new SimpleDateFormat("yyyy-MM-dd a hh:mm:ss",Locale.ENGLISH);String dateTime=" "+sfm.format(date).toLowerCase();time.setText(dateTime);try {Thread.sleep(1000);} catch (InterruptedException e) {}}}}MD5Service(MD5加密)package com.md5.service;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** MD5加密算法** @author xlfdzhf*/public class MD5Service {private String md5EncryptedUp32;private String md5EncryptedLow32;private String md5EncryptedUp16;private String md5EncryptedLow16;public MD5Service(String str){try {MessageDigest md = MessageDigest.getInstance("MD5");md.update(str.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));}md5EncryptedLow32=buf.toString();//32位MD5小写md5EncryptedUp32=md5EncryptedLow32.toUpperCase();//32位MD5大写md5EncryptedLow16=buf.toString().substring(8,24);//16位MD5小写md5EncryptedUp16=md5EncryptedLow16.toUpperCase();//16位MD5大写} catch (NoSuchAlgorithmException e) {}}public String getMd5EncryptedUp32() {return md5EncryptedUp32;}public String getMd5EncryptedLow32() {return md5EncryptedLow32;}public String getMd5EncryptedUp16() {return md5EncryptedUp16;}public String getMd5EncryptedLow16() {return md5EncryptedLow16;}}MD5Main(主方法类)package com.md5.main;import com.md5.view.MD5View;/*** MD5加密主类** @author xlfdzhf*/public class MD5Main {public static void main(String[] args) {MD5View md5=new MD5View();new Thread(md5, "my first runnable").start();}}。
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)。
实验指导书4-MD5加密的Java实现
实验4 MD5加密的Java实现
一、实验目的
通过实验了解MD5加密的原理,掌握Java语言MD5加密的实现。
二、实验原理
1.哈希(Hash)函数的定义
实现数字签名或计算消息的鉴别码。
以任意长度的消息作为输入,输出一个固定长度的二进制值,称为哈希值或消息摘要。
2.MD(Message Digest)消息摘要
MD5对任意输入的消息计算一个128位的固定长度的值
3.MD5的应用
(1)用于校验下载的文件
可用MD5校验工具软件计算,相当于文件的指纹,32位字母数字
常用于软件下载网站
网站:
先计算文件的MD5值,然后和文件一起发布到网站上。
用户:
下载文件后,计算文件的MD5值,和网站发布的MD5值核对。
(2)将用户密码加密后保存
注册时:
将用户的注册密码(P1)用MD5算法加密后(P2)保存到服务器数据库中;
登录时:
将用户的登录密码(P3)用MD5算法加密后(P4),与服务器数据库中的密
文密码(P2)比较。
三、实验环境
开发工具:JDK、Eclipse或JCreator
参考资料:JDK API文档
java.security包
MessageDigest类
四、实验内容和任务
使用Java语言编程,模拟注册和登录过程。
五、实验要求
(1)注册时输入用户名和密码,把密码进行MD5加密后保存在变量里;
(2)登录时,输入用户名和密码,把密码进行MD5加密后,和注册时保存的用户名和密码比较,判断是否登录成功。
Java实现MD5加密的方式与实例代码
Java实现MD5加密的⽅式与实例代码1、什么是MD5 MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进⾏摘要采集,再通过⼀定的位运算,最终获取加密后的MD5字符串。
例如我们要加密⼀篇⽂章,那么我们会随机从每段话或者每⾏中获取⼀个字,把这些字统计出来后,再通过⼀定的运算获得⼀个固定长度的MD5加密后信息。
因此,其很难被逆向破解。
2、MD5有哪些特点MD5加密的特点主要有以下⼏点: 1、针对不同长度待加密的数据、字符串等等,其都可以返回⼀个固定长度的MD5加密字符串。
(通常32位的16进制字符串); 2、其加密过程⼏乎不可逆,除⾮维护⼀个庞⼤的Key-Value数据库来进⾏碰撞破解,否则⼏乎⽆法解开。
3、运算简便,且可实现⽅式多样,通过⼀定的处理⽅式也可以避免碰撞算法的破解。
4、对于⼀个固定的字符串。
数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。
3、Java中MD5加密的实现⽅式具体废话不多说,直接上代码:public static String getMD5String(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值//⼀个byte是⼋位⼆进制,也就是2位⼗六进制字符(2的8次⽅等于16的2次⽅)return new BigInteger(1, md.digest()).toString(16);} catch (Exception e) {e.printStackTrace();return null;}}上述的是利⽤Java⾃带的MessageDigest类实现的最简单的MD5加密⽅法。
javaMD5实现加密解密
javaMD5实现加密解密封装⼀个⽅法⽤于加密/*** md5加密* @param data* @return* @throws NoSuchAlgorithmException*/public static String md5(String data) throws NoSuchAlgorithmException {//信息摘要器算法名称MessageDigest md = MessageDigest.getInstance("MD5");//把字符串转为字节数组byte[] b = data.getBytes();//使⽤指定的字节来更新我们的摘要md.update(b);//获取密⽂(完成摘要计算)byte[] b2 = md.digest();//获取计算的长度int len = b2.length;//16进制字符串String str = "0123456789abcdef";//把字符串转为字符串数组char[] ch = str.toCharArray();//创建⼀个32位长度的字节数组char[] chs = new char[len*2];//循环16次for(int i=0,k=0;i<len;i++) {byte b3 = b2[i];//获取摘要计算后的字节数组中的每个字节// >>>:⽆符号右移// &:按位与//0xf:0-15的数字chs[k++] = ch[b3 >>> 4 & 0xf];chs[k++] = ch[b3 & 0xf];}//字符数组转为字符串return new String(chs);}主函数测试public static void main(String[] args) throws NoSuchAlgorithmException {String data = "跳梁⼩⾖tlxd666";String result = md5(data);System.out.println("加密后:"+result);}。
JavaMD5加密
JavaMD5加密MD5加密很常⽤,⽐如数据库中密码等敏感字段需要加密存储,核对密码时先以同样的⽅式对⽤户输⼊的密码进⾏加密,再与数据库中存储的密码⽐较。
MD5加密有很多种实现⽅式,此处介绍2种。
1、使⽤JDK⾃带MessageDigestpublic class MD5Util {public static String getMD5Str(String str) {byte[] digest = null;try {MessageDigest md5 = MessageDigest.getInstance("md5");digest = md5.digest(str.getBytes("utf-8"));} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}//16是表⽰转换为16进制数String md5Str = new BigInteger(1, digest).toString(16);return md5Str;}}2、使⽤Spring⾃带的DigestUtils上⾯是⾃⼰封装,太⿇烦,Spring已经给我们封装好了。
String md5Str = DigestUtils.md5DigestAsHex("原串".getBytes());说明只使⽤md5加密是不⾏的,很容易被破解。
常见的做法有:先对原串进⾏⼀些处理,⽐如先给它拼接⼀个字符串常量,再进⾏md5加密。
即使对⽅解密,也获取不到原串。
使⽤多种加密算法。
⽐如先⽤md5加密,再对加密的结果使⽤其它加密算法进⾏加密。
⽐如先使⽤md5加密,对加密的结果再次使⽤md5加密。
这2种⽅式⽅式经常⼀起使⽤。
java实现MD5加密算法的简单实例
java实现MD5加密算法的简单实例java 实现MD5加密算法的简单实例实现代码:import java.security.NoSuchAlgorithmException;public class MD5HashUtil{private MessageDigest md = null;private static MD5HashUtil md5 = null;private static final char[] hexChars ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*** Constructor is private so you must use the getInstance method*/private MD5HashUtil() throws NoSuchAlgorithmException{md = MessageDigest.getInstance("MD5");}/*** This returns the singleton instance*/public static MD5HashUtil getInstance()throws NoSuchAlgorithmException{if (md5 == null){md5 = new MD5HashUtil();}return (md5);}public static String hashCode(String dataToHash) throws NoSuchAlgorithmException{return getInstance().hashData(dataToHash.getBytes());}public static String hashCode(byte[] dataToHash) throws NoSuchAlgorithmException{return getInstance().hashData(dataToHash);}public String hashData(byte[] dataToHash) {return hexStringFromBytes((calculateHash(dataToHash))).toLowerCase();}private byte[] calculateHash(byte[] dataToHash){md.update(dataToHash, 0, dataToHash.length);return (md.digest());}public String hexStringFromBytes(byte[] b){String hex = "";int msb;int lsb = 0;int i;// MSB maps to idx 0for (i = 0; i < b.length; i++){msb = ((int)b[i] & 0x000000FF) / 16;lsb = ((int)b[i] & 0x000000FF) % 16;hex = hex + hexChars[msb] + hexChars[lsb];}return(hex);}public static void main(String args[]) throws NoSuchAlgorithmException{String string = "my name is zhangli";System.out.println(string);System.out.println(hashCode(string));}}如上代码为java语⾔实现md5加密算法,输出为加密后的密⽂!通常将加密后的密⽂保存在数据库中,如果需要⽐较只⽐较他们的⽤md5加密过后的密⽂。
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编码对摘要值进行编码。
MD5加密JAVA代码实现
MD5加密JAVA代码实现以下是Java中使用MD5算法进行加密的代码实现:```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException; public class MD5Encryptionpublic static String encrypt(String input)try//创建MD5加密算法的实例MessageDigest md = MessageDigest.getInstance("MD5"); //将输入字符串转换为字节数组byte[] inputBytes = input.getBytes(;//对字节数组进行加密byte[] encryptedBytes = md.digest(inputBytes);//将加密后的字节数组转换为十六进制字符串StringBuilder sb = new StringBuilder(;for (byte b : encryptedBytes)sb.append(String.format("%02x", b));}return sb.toString(;} catch (NoSuchAlgorithmException e)e.printStackTrace(;}return null;}public static void main(String[] args)String input = "Hello World";String encrypted = encrypt(input);System.out.println("Input: " + input);System.out.println("Encrypted: " + encrypted);}```在上述代码中,我们首先创建了一个`MessageDigest`对象,指定其使用MD5算法进行加密。
MD5加密算法(java及js)
MD5加密算法(java及js)为了防⽌⽤户登陆过程中信息被拦截导致信息泄露,我们应该在客户端就对⽤户密码进⾏加密。
浏览器提交给服务器的是加密后的信息,即使被恶意拦截,被拦截信息也已做了加密处理,现在⽐较安全的⼀种加密算法是MD5加密算法,尽管MD5是⼀种单向的加密算法,但⽹上也有破解⽹站,所以为了进⼀步提⾼安全性,可以进⾏两次md5加密,或者结合其他的加密⽅法如3des等进⾏⼆次加密。
代码如下:js版:var hexcase = 0;function hex_md5(a) {if (a == "")return a;return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a, b) {return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a), str2rstr_utf8(b)))}function md5_vm_test() {return hex_md5("abc").toLowerCase() == "900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a) {return binl2rstr(binl_md5(rstr2binl(a), a.length * 8))}function rstr_hmac_md5(c, f) {var e = rstr2binl(c);if (e.length > 16) {e = binl_md5(e, c.length * 8)}var a = Array(16), d = Array(16);for ( var b = 0; b < 16; b++) {a[b] = e[b] ^ 909522486;d[b] = e[b] ^ 1549556828}var g = binl_md5(a.concat(rstr2binl(f)), 512 + f.length * 8);return binl2rstr(binl_md5(d.concat(g), 512 + 128))}function rstr2hex(c) {try {hexcase} catch (g) {hexcase = 0}var f = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";var b = "";var a;for ( var d = 0; d < c.length; d++) {a = c.charCodeAt(d);b += f.charAt((a >>> 4) & 15) + f.charAt(a & 15)}return b}function str2rstr_utf8(c) {var b = "";var d = -1;var a, e;while (++d < c.length) {a = c.charCodeAt(d);e = d + 1 < c.length ? c.charCodeAt(d + 1) : 0;if (55296 <= a && a <= 56319 && 56320 <= e && e <= 57343) {a = 65536 + ((a & 1023) << 10) + (e & 1023);d++}if (a <= 127) {b += String.fromCharCode(a)} else {if (a <= 2047) {b += String.fromCharCode(192 | ((a >>> 6) & 31), 128 | (a & 63))} else {if (a <= 65535) {b += String.fromCharCode(224 | ((a >>> 12) & 15),128 | ((a >>> 6) & 63), 128 | (a & 63))} else {if (a <= 2097151) {b += String.fromCharCode(240 | ((a >>> 18) & 7),128 | ((a >>> 12) & 63),128 | ((a >>> 6) & 63), 128 | (a & 63))}}}}}return b}function rstr2binl(b) {var a = Array(b.length >> 2);for ( var c = 0; c < a.length; c++) {a[c] = 0}for ( var c = 0; c < b.length * 8; c += 8) {a[c >> 5] |= (b.charCodeAt(c / 8) & 255) << (c % 32)}return a}function binl2rstr(b) {var a = "";for ( var c = 0; c < b.length * 32; c += 8) {a += String.fromCharCode((b[c >> 5] >>> (c % 32)) & 255) }return a}function binl_md5(p, k) {p[k >> 5] |= 128 << ((k) % 32);p[(((k + 64) >>> 9) << 4) + 14] = k;var o = 1732584193;var n = -271733879;var m = -1732584194;var l = 271733878;for ( var g = 0; g < p.length; g += 16) {var j = o;var h = n;var f = m;var e = l;o = md5_ff(o, n, m, l, p[g + 0], 7, -680876936);l = md5_ff(l, o, n, m, p[g + 1], 12, -389564586);m = md5_ff(m, l, o, n, p[g + 2], 17, 606105819);n = md5_ff(n, m, l, o, p[g + 3], 22, -1044525330);o = md5_ff(o, n, m, l, p[g + 4], 7, -176418897);l = md5_ff(l, o, n, m, p[g + 5], 12, 1200080426);m = md5_ff(m, l, o, n, p[g + 6], 17, -1473231341);n = md5_ff(n, m, l, o, p[g + 7], 22, -45705983);o = md5_ff(o, n, m, l, p[g + 8], 7, 1770035416);l = md5_ff(l, o, n, m, p[g + 9], 12, -1958414417);m = md5_ff(m, l, o, n, p[g + 10], 17, -42063);n = md5_ff(n, m, l, o, p[g + 11], 22, -1990404162);o = md5_ff(o, n, m, l, p[g + 12], 7, 1804603682);l = md5_ff(l, o, n, m, p[g + 13], 12, -40341101);m = md5_ff(m, l, o, n, p[g + 14], 17, -1502002290);n = md5_ff(n, m, l, o, p[g + 15], 22, 1236535329);o = md5_gg(o, n, m, l, p[g + 1], 5, -165796510);l = md5_gg(l, o, n, m, p[g + 6], 9, -1069501632);m = md5_gg(m, l, o, n, p[g + 11], 14, 643717713);n = md5_gg(n, m, l, o, p[g + 0], 20, -373897302);o = md5_gg(o, n, m, l, p[g + 5], 5, -701558691);l = md5_gg(l, o, n, m, p[g + 10], 9, 38016083);m = md5_gg(m, l, o, n, p[g + 15], 14, -660478335);n = md5_gg(n, m, l, o, p[g + 4], 20, -405537848);o = md5_gg(o, n, m, l, p[g + 9], 5, 568446438);l = md5_gg(l, o, n, m, p[g + 14], 9, -1019803690);m = md5_gg(m, l, o, n, p[g + 3], 14, -187363961);n = md5_gg(n, m, l, o, p[g + 8], 20, 1163531501);o = md5_gg(o, n, m, l, p[g + 13], 5, -1444681467);l = md5_gg(l, o, n, m, p[g + 2], 9, -51403784);m = md5_gg(m, l, o, n, p[g + 7], 14, 1735328473);n = md5_gg(n, m, l, o, p[g + 12], 20, -1926607734);o = md5_hh(o, n, m, l, p[g + 5], 4, -378558);l = md5_hh(l, o, n, m, p[g + 8], 11, -2022574463);m = md5_hh(m, l, o, n, p[g + 11], 16, 1839030562);n = md5_hh(n, m, l, o, p[g + 14], 23, -35309556);o = md5_hh(o, n, m, l, p[g + 1], 4, -1530992060);l = md5_hh(l, o, n, m, p[g + 4], 11, 1272893353);m = md5_hh(m, l, o, n, p[g + 7], 16, -155497632);n = md5_hh(n, m, l, o, p[g + 10], 23, -1094730640);o = md5_hh(o, n, m, l, p[g + 13], 4, 681279174);l = md5_hh(l, o, n, m, p[g + 0], 11, -358537222);m = md5_hh(m, l, o, n, p[g + 3], 16, -722521979);n = md5_hh(n, m, l, o, p[g + 6], 23, 76029189);o = md5_hh(o, n, m, l, p[g + 9], 4, -640364487);l = md5_hh(l, o, n, m, p[g + 12], 11, -421815835);m = md5_hh(m, l, o, n, p[g + 15], 16, 530742520);n = md5_hh(n, m, l, o, p[g + 2], 23, -995338651);o = md5_ii(o, n, m, l, p[g + 0], 6, -198630844);l = md5_ii(l, o, n, m, p[g + 7], 10, 1126891415);m = md5_ii(m, l, o, n, p[g + 14], 15, -1416354905);n = md5_ii(n, m, l, o, p[g + 5], 21, -57434055);o = md5_ii(o, n, m, l, p[g + 12], 6, 1700485571);l = md5_ii(l, o, n, m, p[g + 3], 10, -1894986606);m = md5_ii(m, l, o, n, p[g + 10], 15, -1051523);n = md5_ii(n, m, l, o, p[g + 1], 21, -2054922799);o = md5_ii(o, n, m, l, p[g + 8], 6, 1873313359);l = md5_ii(l, o, n, m, p[g + 15], 10, -30611744);m = md5_ii(m, l, o, n, p[g + 6], 15, -1560198380);n = md5_ii(n, m, l, o, p[g + 13], 21, 1309151649);o = md5_ii(o, n, m, l, p[g + 4], 6, -145523070);l = md5_ii(l, o, n, m, p[g + 11], 10, -1120210379);m = md5_ii(m, l, o, n, p[g + 2], 15, 718787259);n = md5_ii(n, m, l, o, p[g + 9], 21, -343485551);o = safe_add(o, j);n = safe_add(n, h);m = safe_add(m, f);l = safe_add(l, e)}return Array(o, n, m, l)}function md5_cmn(h, e, d, c, g, f) {return safe_add(bit_rol(safe_add(safe_add(e, h), safe_add(c, f)), g), d)}function md5_ff(g, f, k, j, e, i, h) {return md5_cmn((f & k) | ((~f) & j), g, f, e, i, h)}function md5_gg(g, f, k, j, e, i, h) {return md5_cmn((f & j) | (k & (~j)), g, f, e, i, h)}function md5_hh(g, f, k, j, e, i, h) {return md5_cmn(f ^ k ^ j, g, f, e, i, h)}function md5_ii(g, f, k, j, e, i, h) {return md5_cmn(k ^ (f | (~j)), g, f, e, i, h)}function safe_add(a, d) {var c = (a & 65535) + (d & 65535);var b = (a >> 16) + (d >> 16) + (c >> 16);return (b << 16) | (c & 65535)}function bit_rol(a, b) {return (a << b) | (a >>> (32 - b))};java版(代码来源:/computer-lzy/archive/2011/04/28/2031649.html):package md5;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/** MD5 加密算法*/public class MD5 {// 全局数组private final static String[] strDigits = { "0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public MD5() {}// 返回形式为数字跟字符串private static String byteToArrayString(byte bByte) {int iRet = bByte;// System.out.println("iRet="+iRet);if (iRet < 0) {iRet += 256;}int iD1 = iRet / 16;int iD2 = iRet % 16;return strDigits[iD1] + strDigits[iD2];}// 返回形式只为数字private static String byteToNum(byte bByte) {int iRet = bByte;System.out.println("iRet1=" + iRet);if (iRet < 0) {iRet += 256;}return String.valueOf(iRet);}// 转换字节数组为16进制字串private static String byteToString(byte[] bByte) {StringBuffer sBuffer = new StringBuffer();for (int i = 0; i < bByte.length; i++) {sBuffer.append(byteToArrayString(bByte[i]));}return sBuffer.toString();}public static String GetMD5Code(String strObj) {String resultString = null;try {resultString = new String(strObj);MessageDigest md = MessageDigest.getInstance("MD5");// md.digest() 该函数返回值为存放哈希值结果的byte数组resultString = byteToString(md.digest(strObj.getBytes()));} catch (NoSuchAlgorithmException ex) {ex.printStackTrace();}return resultString;}public static void main(String[] args) {MD5 getMD5 = new MD5();System.out.println(getMD5.GetMD5Code(getMD5.GetMD5Code("aaaaaa"))); }}版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。
JAVA中使用MD5加密工具类实现对数据的加密处理
JAVA中使⽤MD5加密⼯具类实现对数据的加密处理1.MD5⼯具类package com.ssm.util;import java.security.MessageDigest;public class MD5Util {//将字节数组转成⼗六进制字符串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;int d1 = n / 16;int d2 = n % 16;//根据下标d1,d2去数组hexDigits的数据return hexDigits[d1] + hexDigits[d2];}public static String MD5Encode(String origin, String charsetname) {String resultString = null;try {resultString = new String(origin);// 获得MD5摘要算法的 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");if (charsetname == null || "".equals(charsetname))//将加密之后的字节数据转换成16进制的字符串resultString = byteArrayToHexString(md.digest(resultString.getBytes()));elseresultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));} catch (Exception exception) {}return resultString;}private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5","6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};}2.在登录注册中使⽤MD5加密算法 demo⽬录结构 数据库⽤户表CREATE TABLE `user` (`id` int(20) NOT NULL AUTO_INCREMENT COMMENT '编号',`userName` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '⽤户名',`password` varchar(50) COLLATE utf8_unicode_ci NOT NULL COMMENT '密码',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci pojo对象User.javapackage com.ssm.pojo;public class User {private Integer id;private String userName;private String password;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {erName = userName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}2.1DAO层 DAO层:DAO层主要是做数据持久层的⼯作,负责与数据库进⾏联络的⼀些任务都封装在此,DAO层的设计⾸先是设计DAO的接⼝,然后在Spring的配置⽂件中定义此接⼝的实现类,然后就可在模块中调⽤此接⼝来进⾏数据业务的处理,⽽不⽤关⼼此接⼝的具体实现类是哪个类,显得结构⾮常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置⽂件中进⾏配置。
JAVA中使用MD5加密实现密码加密
JAVA中使⽤MD5加密实现密码加密1.新建Md5.javapackage com.loger.md5;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import sun.misc.BASE64Encoder;public class Md5 {/**利⽤MD5进⾏加密*/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;}/**判断⽤户密码是否正确*newpasswd ⽤户输⼊的密码*oldpasswd 正确密码*/public boolean checkpassword(String newpasswd,String oldpasswd) throws NoSuchAlgorithmException, UnsupportedEncodingException{ if(EncoderByMd5(newpasswd).equals(oldpasswd))return true;elsereturn false;}}2.新建测试类package com.loger.md5;import java.io.UnsupportedEncodingException;import java.security.NoSuchAlgorithmException;public class MyTest {public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {Md5 md5 = new Md5();String str = "apple";try {String newString = md5.EncoderByMd5(str);System.out.println(newString);} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(md5.EncoderByMd5("apple").equals("HzhwvidPbEmz4xoMZyiVfw=="));}}运⾏结果:说明:可能会出现找不到 BASE64Encoder 这个类,在eclipse中按住 ctr+shift + T 即可查找到!以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
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加密(可直接使⽤)上部分是转载的关于字符串的加密,后半部分则⽐较全,包括字符串、⽂件、字节数组、等1. package util;2.3. import java.security.MessageDigest;4.5. public class Encript {6. //⼗六进制下数字到字符的映射数组7. private final static String[] hexDigits = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};8.9. /**把inputString加密*/10. public static String md5(String inputStr){11. return encodeByMD5(inputStr);12. }13.14. /**15. * 验证输⼊的密码是否正确16. * @param password 真正的密码(加密后的真密码)17. * @param inputString 输⼊的字符串18. * @return 验证结果,boolean类型19. */20. public static boolean authenticatePassword(String password,String inputString){21. if(password.equals(encodeByMD5(inputString))){22. return true;23. }else{24. return false;25. }26. }27.28. /**对字符串进⾏MD5编码*/29. private static String encodeByMD5(String originString){30. if (originString!=null) {31. try {32. //创建具有指定算法名称的信息摘要33. MessageDigest md5 = MessageDigest.getInstance("MD5");34. //使⽤指定的字节数组对摘要进⾏最后更新,然后完成摘要计算35. byte[] results = md5.digest(originString.getBytes());36. //将得到的字节数组变成字符串返回37. String result = byteArrayToHexString(results);38. return result;39. } catch (Exception e) {40. e.printStackTrace();41. }42. }43. return null;44. }45.46. /**47. * 轮换字节数组为⼗六进制字符串48. * @param b 字节数组49. * @return ⼗六进制字符串50. */51. private static String byteArrayToHexString(byte[] b){52. StringBuffer resultSb = new StringBuffer();53. for(int i=0;i<b.length;i++){54. resultSb.append(byteToHexString(b[i]));55. }56. return resultSb.toString();57. }58.59. //将⼀个字节转化成⼗六进制形式的字符串60. private static String byteToHexString(byte b){61. int n = b;62. if(n<0)63. n=256+n;64. int d1 = n/16;65. int d2 = n%16;66. return hexDigits[d1] + hexDigits[d2];67. }68. }69. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++70. package com.angsentech.ssm.util;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** MD5加密处理⼯具类* @author Administrator**/public class MD5Utils {/*** 默认的密码字符串组合,⽤来将字节转换成 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(MD5Utils.class.getName()+ "初始化失败,MessageDigest不⽀持MD5Util。
使用JAVA生成MD5编码
使用JAVA生成MD5编码在Java中生成MD5编码可以使用Java的MessageDigest类。
MessageDigest类是Java提供的一个密码散列函数,用于生成摘要(散列值)的对象。
下面是一个使用Java生成MD5编码的示例代码:```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Examplepublic static void main(String[] args)String input = "Hello World!";try//创建一个MD5对象MessageDigest md = MessageDigest.getInstance("MD5");//将输入转换为字节数组byte[] inputBytes = input.getBytes(;//计算MD5摘要byte[] mdBytes = md.digest(inputBytes);//将摘要转换为字符串StringBuilder sb = new StringBuilder(;for (byte mdByte : mdBytes)sb.append(Integer.toString((mdByte & 0xff) + 0x100,16).substring(1));}String md5 = sb.toString(;System.out.println("MD5: " + md5);} catch (NoSuchAlgorithmException e)e.printStackTrace(;}}```此示例中,我们首先将要计算MD5编码的字符串转换为字节数组,并使用`MessageDigest.getInstance("MD5")`方法创建一个MD5对象。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
南昌航空大学科技学院实验报告
2016年 10 月 10 日
课程名称:信息安全概论实验名称: MD5加密的Java实现
学号: 148206102 姓名:刘婷
指导老师评定:签名:
一、实验目的
通过实验了解MD5加密的原理,掌握Java语言MD5加密的实现。
二、实验原理
1.哈希(Hash)函数的定义
实现数字签名或计算消息的鉴别码,以任意长度的消息作为输入,输出一个固定长度的二进制值,称为哈希值或消息摘要。
2.MD(Message Digest)消息摘要
MD5对任意输入的消息计算一个128位的固定长度的值
3.MD5的应用
(1)用于校验下载的文件
可用MD5校验工具软件计算,相当于文件的指纹,32位字母数字常用于软件下载网站。
网站:
先计算文件的MD5值,然后和文件一起发布到网站上。
用户:
下载文件后,计算文件的MD5值,和网站发布的MD5值核对。
(2)将用户密码加密后保存
注册时:
将用户的注册密码(P1)用MD5算法加密后(P2)保存到服务器数据库中。
登录时:
将用户的登录密码(P3)用MD5算法加密后(P4),与服务器数据库中的密文密码(P2)比较。
三、实验环境
开发工具:JDK、Eclipse或JCreator
参考资料:JDK API文档
java.security包MessageDigest类
四、实验内容和结果
4.1实验内容
使用Java语言编程,计算字符串的MD5值,分别用非图形界面程序和图形界面程序实现。
模拟注册和登录过程,使用MD5加密处理密码,代码如下:
//主界面
import javax.swing.*;
import java.awt.*;
public class Window extends JFrame {
JTextField inputText;
JTextArea textShow;
JButton button;
MyCommandListener listener;
public Window(){
init();
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
void init(){
setLayout(new FlowLayout());
inputText=new JTextField(10);
textShow=new JTextArea(9,30);
button=new JButton("加密");
add(inputText);
add(button);
add(new JScrollPane(textShow));
}
void setMyCommandListener( MyCommandListener listener){
this.listener=listener;
listener.setJTextFiled(inputText);
listener.setJTextArea(textShow);
inputText.addActionListener(listener);
button.addActionListener(listener);
}
}
//MyCommandListener接口
import java.awt.event.ActionListener;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public interface MyCommandListener extends ActionListener{
public void setJTextFiled(JTextField text);
public void setJTextArea(JTextArea area);
}
//PoliceListener创建监视器
import javax.swing.*;
import java.awt.event.*;
public class PoliceListener implements MyCommandListener{ JTextField textinput;
JTextArea textShow;
public void actionPerformed(ActionEvent e) {
String s=textinput.getText();
MD5 md51 = new MD5();
md51.md5s(s);
s=md51.getmd5();
textShow.setText(s);
}
public void setJTextFiled(JTextField text) {
textinput=text;
}
public void setJTextArea(JTextArea area) {
textShow=area;
}
}
//MD5算法
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//import java.util.Scanner;
public class MD5 {
public String str;
public String getmd5()
{return str;}
public void md5s(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));
}
str = buf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
}
//主类
public class MainWnd {
public static void main(String[] args) {
Window win=new Window();
PoliceListener police=new PoliceListener();
win.setMyCommandListener(police);
win.setBounds(100, 100, 460, 360);
win.setTitle("MD5计算器"):
}
}
4.2实验结果
用java.security包的MessageDigest类创建对象,调用update( )和digest( )方法字符串的MD5值,用非图形界面程序和图形界面程序来实现;注册时输入用户名和密码,把密码进行MD5加密后保存在变量里;登录时,输入用户名和密码,把密码进行MD5加密后和注册时保存的用户名和密码比较,判断是否登录成功。
五、实验总结
通过本次实验实现了简单的注册,输入用户名和密码,把密码进行MD5加密后保存在变量里,并且登录时,输入用户名和密码,把密码进行MD5加密后和注册时保存的用户名和密码比较,判断是否登录成功。