zoukankan      html  css  js  c++  java
  • Java对字符串使用MD5进行加密(亲测有效)

    转自:https://blog.csdn.net/jay314159/article/details/4918358

    前言:

       MD5即Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的算法之一,主流的编程语言均有MD5的实现。

      将数据(字符串)运算为另一固定长度值是加密的基本原理,MD5的前身有MD2、MD3、MD4。

      本文介绍使用MD5进行加密和验证,将原本的字符串通过MD5加密后成另一个字符串,而且根据新的字符串无法获得原字符串,但可以在不知道原始密码的情况下进行验证。

    关键技术:

      通过java.security.MessageDigest的静态方法getInstance创建具有指定算法名称的信息摘要,参数为算法名,传入"MD5"则表明要使用MD5算法。

      MessageDigest的digest实例方法使用指定的字节数组对摘要进行最后更新,然后完成摘要计算,返回存放哈希值结果的季节数组,这个数组就是MD5加密产品。

      将加密后的字节数组转换成十六进制的字符窜,形成最终的密码。

      当输入字符串经过MD5加密后,得到的字符串与密码一样,则认为密码验证通过。

    实例演示:

    package com.zhanzhuang.md5;
    
    import java.security.MessageDigest;
    
    /**
     * @author zhan zhuang
     * @time 2018年6月8日下午1:48:06
     *
     */
    public class Encryption {
    
        public static void main(String[] args) {
    
            String password = Encryption.createPassword("123456");
    
            System.out.println("对123456用MD5加密后的密码为:" + password);
    
            String inputstr = "1234";
    
            System.out.println("1234与密码相同?" + Encryption.authenticatePassword(password, inputstr));
    
            inputstr = "123456";
    
            System.out.println("123456与密码相同?" + Encryption.authenticatePassword(password, inputstr));
    
        }
    
        // 16进制下数字到字符的映射数组
        private static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c",
                "d", "e", "f" };
    
        // 将inputstr加密的方法
        public static String createPassword(String inputstr) {
            return encodeByMD5(inputstr);
        }
    
        // 验证密码是否正确
        public static boolean authenticatePassword(String pass, String inputstr) {
            if (pass.equals((encodeByMD5(inputstr)))) {
                return true;
            } else {
                return false;
            }
        }
    
        // 对字符串进行MD5编码
        private static String encodeByMD5(String originstr) {
            if (originstr != null) {
                try {
                    // 创建具有指定算法名称的信息摘要
                    MessageDigest md = MessageDigest.getInstance("MD5");
                    // 使用指定的字节数组对摘要进行最后的更新,然后完成摘要计算
                    byte[] results = md.digest(originstr.getBytes());
                    // 将得到的字节数组编程字符串返回
                    String resultString = byteArrayToHexString(results);
                    return resultString.toUpperCase();
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            return null;
        }
    
        // 转换字节数组为十六进制字符串
        private static String byteArrayToHexString(byte[] b) {
            StringBuffer resultsb = new StringBuffer();
            int i = 0;
            for (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];
        }
    
    }

     

  • 相关阅读:
    理解C语言中指针常量和常量指针区别!不要再搞混了~
    哪座城市可以安放程序员的灵魂,一线城市与二三线城市该如何择别?
    Linux 之父如何定义 "Linux" !主要想让黑客、计算机学生使用,学习和享受!
    程序员的凡尔赛文学!作为低调人群的程序员,“凡”起来又是怎样的一番景象呢?
    40个Java集合面试问题和答案
    从关系型数据库到非关系型数据库
    redis安装报错
    redis简介
    不满足依赖关系
    EL表达式中引用隐式变量
  • 原文地址:https://www.cnblogs.com/zhanzhuang/p/9155323.html
Copyright © 2011-2022 走看看