1、什么是md5加密算法?
学习之前对md5的了解:
在我看到md5算法的时候,我一直以为就是对字符串进行模5的一种很简单的算法,但是现在学习以后才知道原来这是一个很复杂的算法,而且现在应用也很广泛。比如说:数字签名。(数字签名的应用:举个例子,你将一段话写在一个叫 readme.txt文件中,并对这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。)括号内是引用百度百科的内容
学习之后对md5的感觉:
md5的全名是:Message-Digest Algorithm 5(信息-摘要算法5)。
它的主要特点是:可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。
md5的发展历程:技术不论大小,任何一门科学都是慢慢发展来的。同样的md5发展到现在是有其一定的历史的。经过查阅资料,我了解到它有几个版本:md1、md2、md3、md4这几个版本,这些版本的差异这里就不说了。
2、md5加密算法用代码实现(java)?
- package view.login.composer;
- import java.security.MessageDigest;
- /**
- * 对密码进行加密和验证的类
- */
- public class CipherUtil{
- private final static String[] hexDigits = {"0", "1", "2", "3", "4",
- "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
- /** * 把inputString加密 */
- public static String generatePassword(String inputString){
- return encodeByMD5(inputString);
- }
- public static boolean validatePassword(String password, String inputString){
- if(password.equals(encodeByMD5(inputString))){
- return true;
- } else{
- return false;
- }
- }
- public static String returnEncodeByMde(String originString){
- return encodeByMD5(originString);
- }
- /** 对字符串进行MD5加密 */
- private static String encodeByMD5(String originString){
- if (originString != null){
- try{
- MessageDigest md = MessageDigest.getInstance("MD5");
- //返回值为存放哈希值结果的byte数组,
- byte[] results = md.digest(originString.getBytes());
- //将得到的字节数组变成字符串返回
- String resultString = byteArrayToHexString(results);
- String pass = resultString.toUpperCase();
- return pass;
- } catch(Exception ex){
- ex.printStackTrace();
- }
- }
- return null;
- }
- 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;
- /**对这个地方加256的理解:
- 1、要用16进制来表示就是要用两个hexDigits数组里面的元素:16*16=256,所以要把n限制在0~256的范围内
- 2、要想把n限制在0~256的范围内,我们就要处理b这个字节,我们先把b转化为整数,转化为整数的时候有分有符号和无符号的
- 有符号的b的范围是-127~127,无符号的范围是0~256。我们现在用的都是有符号的类型,所以就有负数存在,我们就要把它转化为正数,但是转化为正数我们可以加127~256之间的任何一个数,为什么我们要加256呢?以下是个人的见解:
- 我们知道:b转化为整数是-127~-1和0~127。正数部分占居了0~127,接下来就剩下128~255(注意不能有256,因为256/16=16这样数组就越界了)
- -127+256=129
- -1+256=255
- 转化以后的范围为129~255,没有了128(不知道为什么),这样就除了128没有取到,其他的数字都有可能取到,基于这种算法,我推出
- 这样改
- if(n<=0){
- n=255+n;
- }
- */
- 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 pwd1="123";
- String pwd2="";
- CipherUtil cipher = new CipherUtil();
- System.out.println("未加密的密码:"+pwd1);
- //将123加密
- pwd2 = cipher.generatePassword(pwd1);
- System.out.println("加密后的密码:"+pwd2);
- System.out.print("验证密码是否下确:");
- if(cipher.validatePassword(pwd2, pwd1)) {
- System.out.println("正确");
- }
- else {
- System.out.println("错误");
- }
- }
- }