精华内容
下载资源
问答
  • java-MD5解密算法

    千次阅读 2013-01-07 09:35:44
    在网络中MD5是著名的不可逆算法,但是如果知道MD5的加密的字符串 则可以通过自己的加密算法明文进行加密,加密后的密文与字符串匹配; 匹配成功,表示找到明文;但是此程序的时间耗费较高!仅提供一个解密的...
    在网络中MD5是著名的不可逆算法,但是如果知道MD5的加密的字符串


    则可以通过自己的加密算法对明文进行加密,对加密后的密文与字符串匹配;


    匹配成功,表示找到明文;但是此程序的时间耗费较高!仅提供一个解密的方法!


    package md5;


    import java.util.Date;


    /**
    * @author greatwqs
    * @see Md5密码破解
    */
    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',
        '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', ',', '.', '/', ';', '\'', ':', '"',
        '[', ']', '{', '}', '\\', '|', '!', '@', '#', '$', '%', '^', '&',
        '*', '(', ')', '-', '_', '+', '=', '0', '1', '2', '3', '4', '5',
        '6', '7', '8', '9' };


    /**
    * 六位密码破解
    */
    public static void Md5_6(String md5Password) {
       String testPassword;
       MD5 md5Obj = new MD5();
       String result;
       for (int a = 0; a < code.length; a++) {
        testPassword = "";
        testPassword += code[a];
        for (int b = 0; b < code.length; b++) {
         testPassword = testPassword.substring(0, 1);
         testPassword += code[b];
         for (int c = 0; c < code.length; c++) {
          testPassword = testPassword.substring(0, 2);
          testPassword += code[c];
          for (int d = 0; d < code.length; d++) {
           testPassword = testPassword.substring(0, 3);
           testPassword += code[d];
           for (int e = 0; e < code.length; e++) {
            testPassword = testPassword.substring(0, 


    4);
            testPassword += code[e];
            for (int f = 0; f < code.length; f++) {
             testPassword = 


    testPassword.substring(0, 5);
             testPassword += code[f];
             // System.out.println


    (testPassword);
             result = md5Obj.getMD5ofStr


    (testPassword);
             if (md5Password.equals(result)) {
              System.out.println("密码


    已经破解!");
              System.out.println("明文


    是:" + testPassword);
              System.out.println("密文


    是:" + md5Password);
              return;
             }
            }
           }
          }
         }
        }
       }
    }


    /**
    * 七位密码破解,写法详见六位密码破解
    */
    public static void Md5_7(String md5Password) {
    }


    /**
    * 八位密码破解,写法详见六位密码破解
    */
    public static void Md5_8(String md5Password) {
    }


    public static void main(String[] args) {
       MD5 md5Obj = new MD5();
                    // MD5加密对象
       String md5Password = md5Obj.getMD5ofStr(password);
       // 把这个认为我要找到的经过加密的密码
       System.out.println("密码破测试中!");
       System.out.println("明文是:" + password);
       System.out.println("密文是:" + md5Password);
       System.out.println("程序时间计时器!");
       System.out.println("开始时间:" + new Date());
       Md5_6(md5Password);
       // 依次调用6位破解到20位破解..
       // Md5_7(testResult);
       System.out.println("结束时间:" + new Date());
    }


    private static final String password = "aaa918";


    /**
    * 这里只是一个实现的方法, 在自己破解的时候把自己的密文直接贴出来, 
    * 进行破解, 这里只是进行一个aaaBc8加密的测试
    */
    private static final String MD5PWD = "你的数据库中的密文";
    }



    展开全文
  • 基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/*** 字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static ...

    基础: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 block

    e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

    // TODO Auto-generated catch block

    e.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 block

    e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

    // TODO Auto-generated catch block

    e.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消息摘要算法(英语:MD5Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一...就是小编也不知道,通俗一点MD5是一种算法,用于数据的安全方面数据进行加密和解密,虽然MD5被认为不安全,...

    MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

    这波解释是不是很正经严肃,好像看懂了,但是如果有人问MD5是什么,MD5就是...就是小编也不知道,通俗一点MD5是一种算法,用于数据的安全方面对数据进行加密和解密,虽然MD5被认为不安全,而且渐渐被AES所取代,但是对于一般的情况下使用时可以的,例如某个管理后台的账号密码加密,普通的HTTP请求签名,数据库存储的一些重要数据加密,在这小编就说一下MD5在Java上的使用。

    在JDK内部集成多种算法,包括MD5和AES等,那MD5在Java上的使用就非常简单了,默认的加密是小写的,如下

    1e646f3ee1a0

    知道你们这些懒人肯定要可以复制的源码,小编会在最后附上整个工具类的源码的,默认的加密就是生成小写,但是如果想要使用大写也非常简单,就是使用,自定义一个数组,代码如下

    1e646f3ee1a0

    下面附上整个工具类的源码,小编哪里有写的不好或者有错误,希望大家能留言指出

    import org.apache.commons.codec.binary.Hex;

    import java.security.MessageDigest;

    import java.security.NoSuchAlgorithmException;

    import java.util.Random;

    /**

    * @date 2019/9/16 10:30

    */

    public class MD5Utils {

    /**

    * 字符串MD5(小写+字母)

    *

    * @param str 要进行MD5的字符串

    */

    public static StringgetStrMD5(String str) {

    // 获取MD5实例

    MessageDigest md5 =null;

    try {

    md5 = MessageDigest.getInstance("MD5");

    }catch (NoSuchAlgorithmException e) {

    e.printStackTrace();

    System.out.println(e.toString());

    return "获取MD5实例异常";

    }

    // 将加密字符串转换为字符数组

    char[] charArray = str.toCharArray();

    byte[] byteArray =new byte[charArray.length];

    // 开始加密

    for (int i =0; i < charArray.length; i++)

    byteArray[i] = (byte) charArray[i];

    byte[] digest = md5.digest(byteArray);

    StringBuilder sb =new StringBuilder();

    for (int i =0; i < digest.length; i++) {

    int var = digest[i] &0xff;

    if (var <16)

    sb.append("0");

    sb.append(Integer.toHexString(var));

    }

    return sb.toString();

    }

    /**

    * 字符串MD5(大写+字母)

    *

    * @param password 要进行MD5的字符串

    */

    public static StringgetStrrMD5(String password) {

    char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    try {

    byte strTemp[] = password.getBytes("UTF-8");

    MessageDigest mdTemp = MessageDigest.getInstance("MD5");

    mdTemp.update(strTemp);

    byte md[] = mdTemp.digest();

    int j = md.length;

    char str[] =new char[j *2];

    int k =0;

    for (int i =0; i < j; i++) {

    byte byte0 = md[i];

    str[k++] = hexDigits[byte0 >>>4 &15];

    str[k++] = hexDigits[byte0 &15];

    }

    return new String(str);

    }catch (Exception e) {

    return null;

    }

    }

    /**

    * 加盐MD5

    */

    public static StringgetSaltMD5(String password) {

    // 生成一个16位的随机数

    Random random =new Random();

    StringBuilder sBuilder =new StringBuilder(16);

    sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));

    int len = sBuilder.length();

    if (len <16) {

    for (int i =0; i <16 - len; i++) {

    sBuilder.append("0");

    }

    }

    // 生成最终的加密盐

    String Salt = sBuilder.toString();

    password =md5Hex(password + Salt);

    char[] cs =new char[48];

    for (int i =0; i <48; i +=3) {

    cs[i] = password.charAt(i /3 *2);

    char c = Salt.charAt(i /3);

    cs[i +1] = c;

    cs[i +2] = password.charAt(i /3 *2 +1);

    }

    return String.valueOf(cs);

    }

    /**

    * 验证加盐后是否和原文一致

    * @param password  md5原文

    * @param md5str    加盐md5后的md5串

    */

    public static boolean getSaltverifyMD5(String password, String md5str) {

    char[] cs1 =new char[32];

    char[] cs2 =new char[16];

    for (int i =0; i <48; i +=3) {

    cs1[i /3 *2] = md5str.charAt(i);

    cs1[i /3 *2 +1] = md5str.charAt(i +2);

    cs2[i /3] = md5str.charAt(i +1);

    }

    String Salt =new String(cs2);

    return md5Hex(password + Salt).equals(String.valueOf(cs1));

    }

    /**

    * 单次加密,双次解密

    */

    public static StringgetconvertMD5(String inStr) {

    char[] charArray = inStr.toCharArray();

    for (int i =0; i < charArray.length; i++) {

    charArray[i] = (char) (charArray[i] ^'t');

    }

    String str = String.valueOf(charArray);

    return str;

    }

    /**

    * 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转

    */

    @SuppressWarnings("unused")

    private static Stringmd5Hex(String str) {

    try {

    MessageDigest md = MessageDigest.getInstance("MD5");

    byte[] digest = md.digest(str.getBytes());

    return new String(new Hex().encode(digest));

    }catch (Exception e) {

    e.printStackTrace();

    System.out.println(e.toString());

    return "";

    }

    }

    public static void main(String[] args) {

    System.out.println(getSaltMD5("admin"));

    System.out.println(getSaltverifyMD5("admin","092956b6b61a40a011f3076c650194991954f3584fa92220"));

    System.out.println(getconvertMD5("admin"));

    System.out.println(getconvertMD5(getconvertMD5("admin")));

    }

    }

    补充说明:

    MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数。数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密,与数据库中所存储的MD5值匹配,从而降低密码数据库被盗取后用户损失的风险。

    MD5加密算法以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

    展开全文
  • java实现md5 加密解密

    热门讨论 2013-08-20 09:58:44
    java实现md5 加密解密(在网络中MD5是著名的不可逆算法,但是如果知道MD5的加密的字符串 则可以通过自己的加密算法明文进行加密,加密后的密文与字符串匹配; 匹配成功,表示找到明文;但是此程序的时间耗费较高!仅...
  • 很多时候要秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了import java.io.IOException;import java.security.MessageDigest;import java.security.SecureRandom;import javax.crypto....

    很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了

    import java.io.IOException;

    import java.security.MessageDigest;

    import java.security.SecureRandom;

    import javax.crypto.Cipher;

    import javax.crypto.SecretKey;

    import javax.crypto.SecretKeyFactory;

    import javax.crypto.spec.DESKeySpec;

    import sun.misc.BASEDecoder;

    import sun.misc.BASEEncoder;

    /**

    * 密匙工具类(包含des加密与md加密)

    * @author mingge

    *

    */

    public class KeysUtil {

    private final static String DES = "DES";

    private final static String MD = "MD";

    private final static String KEY="opeddsaeaddadbcabf";

    /**

    * MD加密算法

    * @param data

    * @return

    */

    public static String mdEncrypt(String data) {

    String resultString = null;

    try {

    resultString = new String(data);

    MessageDigest md = MessageDigest.getInstance(MD);

    resultString =bytehexString(md.digest(resultString.getBytes()));

    } catch (Exception ex) {

    }

    return resultString;

    }

    private static String bytehexString(byte[] bytes) {

    StringBuffer bf = new StringBuffer(bytes.length * );

    for (int i = ; i < bytes.length; i++) {

    if ((bytes[i] & xff) < x) {

    bf.append("T");

    }

    bf.append(Long.toString(bytes[i] & xff, ));

    }

    return bf.toString();

    }

    /**

    * Description 根据键值进行加密

    * @param data

    * @param key 加密键byte数组

    * @return

    * @throws Exception

    */

    public static String desEncrypt(String data, String key) throws Exception {

    if (key==null) {

    key=KEY;

    }

    byte[] bt = encrypt(data.getBytes(), key.getBytes());

    String strs = new BASEEncoder().encode(bt);

    return strs;

    }

    /**

    * Description 根据键值进行解密

    * @param data

    * @param key 加密键byte数组

    * @return

    * @throws IOException

    * @throws Exception

    */

    public static String desDecrypt(String data, String key) throws IOException,

    Exception {

    if (data == null){

    return null;

    }

    if (key==null) {

    key=KEY;

    }

    BASEDecoder decoder = new BASEDecoder();

    byte[] buf = decoder.decodeBuffer(data);

    byte[] bt = decrypt(buf,key.getBytes());

    return new String(bt);

    }

    /**

    * Description 根据键值进行加密

    * @param data

    * @param key 加密键byte数组

    * @return

    * @throws Exception

    */

    private static byte[] encrypt(byte[] data, byte[] key) throws Exception {

    // 生成一个可信任的随机数源

    SecureRandom sr = new SecureRandom();

    // 从原始密钥数据创建DESKeySpec对象

    DESKeySpec dks = new DESKeySpec(key);

    // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

    SecretKey securekey = keyFactory.generateSecret(dks);

    // Cipher对象实际完成加密操作

    Cipher cipher = Cipher.getInstance(DES);

    // 用密钥初始化Cipher对象

    cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);

    return cipher.doFinal(data);

    }

    /**

    * Description 根据键值进行解密

    * @param data

    * @param key 加密键byte数组

    * @return

    * @throws Exception

    */

    private static byte[] decrypt(byte[] data, byte[] key) throws Exception {

    // 生成一个可信任的随机数源

    SecureRandom sr = new SecureRandom();

    // 从原始密钥数据创建DESKeySpec对象

    DESKeySpec dks = new DESKeySpec(key);

    // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);

    SecretKey securekey = keyFactory.generateSecret(dks);

    // Cipher对象实际完成解密操作

    Cipher cipher = Cipher.getInstance(DES);

    // 用密钥初始化Cipher对象

    cipher.init(Cipher.DECRYPT_MODE, securekey, sr);

    return cipher.doFinal(data);

    }

    }

    下面在给大家介绍一段代码关于Java实现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 block

    e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

    // TODO Auto-generated catch block

    e.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 block

    e.printStackTrace();

    } catch (UnsupportedEncodingException e) {

    // TODO Auto-generated catch block

    e.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;

    }

    }

    }

    展开全文
  • Java对大文件MD5解密详解

    千次阅读 2017-05-23 16:12:48
    MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性。用术语讲,MD5是一种消息摘要算法(Message ... Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符
  • 基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/*** 字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static ...
  • 如果安全性的需求不是太高,MD5仍是使用非常方便和普及的加密方式,比如Java中自带的MessageDigest类就提供了支持,这里就为大家带来Java实现MD5加密及解密的代码实例分享:
  • 基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/*** 字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static ...
  • 基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/*** 字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static ...
  • 基础:MessageDigest类的使用其实要在Java中完成MD5加密,MessageDigest类大部分都帮你实现好了,几行代码足矣:/*** 字符串md5加密** @param str* @return*/import java.security.MessageDigest;public static ...
  • 简介Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也...Hutool是项目中“util”包友好的替代,它节省了开发人员项目中公...
  • 与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,如果任何人文件名做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。MD5还广泛用于操作系统的登陆认证上...
  • /**功能:字符串进行加密处理*参数一:需要加密的内容*参数二:密钥*/function passport_encrypt($str,$key){ //加密函数...$encrypt_key=md5(rand(0, 32000));$ctr=0;$tmp='';for($i=0;$i$ctr=$ctr==strlen($encr...
  • Java实现MD5加密及解密的代码实例

    千次阅读 2019-03-05 17:12:10
    础:MessageDigest类的使用 其实要在Java中完成MD5加密,... * 字符串md5加密 * * @param str * @return */ import java.security.MessageDigest; public static String getMD5(String str) { tr...
  • JavaMD5加密和解密

    万次阅读 2013-04-12 20:39:02
    理解MD5 MD5的应用非常广泛。例如我们在unix中下载某种软件时,常常会看到一个扩展名为.md5的文件,内容大概是...因此当我们得到这个文件后,使用工具计算该文件对应的md5值,然后和文件中记录的.md5中记录的值进行
  • 目前java6本身只是支持MD2和MD5的消息摘要实现应用:这种摘要算法主要用来校验文件是否被获取的准确性。大家到apache的官方下载的文件的时候通常配备一些消息摘要算法进行验证如下是实现的代码:package com.ca.test...
  • Hutool 是什么Hutool 是一个 Java 工具包类库,它可以文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种 Utils 工具类。Hutool 即是 Hu(谐音“糊涂”) + tool,前者致敬作者 “前任...
  • Hutool 是什么Hutool 是一个 Java 工具包类库,它可以文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种 Utils 工具类。Hutool 即是 Hu(谐音“糊涂”) + tool,前者致敬作者 “前任...
  • JAVAMD5加密与解密

    万次阅读 热门讨论 2008-11-21 15:05:00
    MD5的典型应用是一段Message(字节串)产生fingerprint(指纹),以防止被"篡改"。举个例子,你将一段话写在一个叫readme.txt文件中,并这个readme.txt产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,...
  • 阅读本文大概需要 2.8 分钟。...Hutool 是什么Hutool 是一个 Java 工具包类库,它可以文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种 Utils 工具类。Hutool 即是 Hu(谐...
  • Java解密技术之 MD5

    万次阅读 2016-12-15 21:56:37
    这篇文章继续加解密的系列,当然也是介绍比较基础的加密方式 — — MD5MD5 属于单向加密算法,是不可逆的加密方式,也就是说,采用了 MD5 加密方式加密之后,就不能加密的结果进行解密,得到原有的字符串,这是...
  • 简介Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也...Hutool是项目中“util”包友好的替代,它节省了开发人员项目中公...
  • 前言:大数据时代,每个人的生活中都不存在所谓的绝对“秘密”,通过网络上的数据信息可以分析出一个人生活的各种痕迹。因此,保障大数据信息安全至关...2.数据完整性防止非授权实体数据进行非法篡改,即数据在传输...
  • 03_Java中的加解密MD5 一.消息摘要: 消息摘要(Message Digest): 又称为数字摘要(Digital Digest)。它是一个对应一条消息或文本的固定长度的唯一的值,该值由一个单向的Hash加密函数消息进行作用而产生。如果...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 417
精华内容 166
关键字:

java对md5解密

java 订阅