精华内容
下载资源
问答
  • MD5加密--加盐MD5加密

    2018-03-13 13:19:04
    输入需要加密的字符串,有两种加密方式,普通md5加密和加盐MD5加密。根据需要生成。
  • 主要介绍了Springboot整合Shiro之加盐MD5加密的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 一、加盐MD5加密工具 package com.dimpt.base.util; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security....

    一、加盐MD5加密工具

    package com.dimpt.base.util;
    
    
    import java.io.UnsupportedEncodingException;
    import java.security.MessageDigest;
    import java.security.NoSuchAlgorithmException;
    import java.security.SecureRandom;
    import java.util.Arrays;
    
    /**
     * MD5加密及密码验证
     */
    public class MD5Util {
    
        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);
        }
    }
    
    

    二、未加盐MD5加密工具

    package com.dimpt.base.util;
    
    
    import com.dimpt.base.intf.PasswordEncoder;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.util.Assert;
    import org.springframework.util.StringUtils;
    
    import java.security.MessageDigest;
    
    public class Md5PasswordEncoder implements PasswordEncoder {
    
        protected static final Logger logger = LoggerFactory.getLogger(Md5PasswordEncoder.class);
    
        /**
         * 使用MD5对密码进行加密
         * 先取密码的首尾两个字符进行md5生成临时字符,然后将原始密码与临时字符拼接再次进行md5
         *
         * @param password 明文密码
         * @return 加密后的密码
         */
        @Override
        public String encode(String password) {
            Assert.hasText(password, "密码加密失败:密码不能为空");
            String tmpStr = password.substring(0, 1) + password.substring(password.length() - 1);
            String tmpMd5 = md5(tmpStr);
            String content = password + tmpMd5;
            return md5(content);
        }
    
        @Override
        public boolean match(String source, String target) {
            boolean result = false;
            if (StringUtils.hasText(source) && StringUtils.hasText(target)) {
                result = source.equals(target);
            }
            return result;
        }
    
        private static String md5(String source) {
           char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
            try {
                byte[] strTemp = source.getBytes();
                // 使用MD5创建MessageDigest对象
                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 b = md[i];
                    str[k++] = hexDigits[b >> 4 & 0xf];
                    str[k++] = hexDigits[b & 0xf];
                }
    
                if (logger.isDebugEnabled()) {
                    logger.debug("加密后的字符串:" + new String(str));
                }
                return new String(str);
            } catch (Exception e) {
                logger.error("md5加密出错:" + source, e);
                return null;
            }
        }
    
    }
    
    
    
    
    展开全文
  • 加盐MD5的sign签名

    2021-01-14 15:46:34
    如果使用MD5算法,则需要在拼装的字符串前后加上app的secret后,再进行摘要,如:md5(secret+bar2foo1foo_bar3foobar4#{“a”:1,“b”:2,“c”:{“e”:5,“f”:6,“g”:7},“d”:4}+secret); • 将摘要得到的字节流...

    为什么要签名?

    为了防止API调用过程中被黑客恶意篡改,调用任何一个API都需要携带签名,服务端会根据请求参数,对签名进行验证,签名不合法的请求将会被拒绝

    签名规则

    • 线下分配sysKey/secret,由openAPI管理员分配
    • timestamp时间戳校验,例如:30分钟数据有效
    • sign,所有body+parameter 数据的签名信息
      以上加粗字段为公共参数
      例如分配的sysKey是 li1234, secret是 1234567890

    签名算法

    • 对URL里的请求参数(包括公共参数和业务参数,但除去sign参数和File, byte[]类型的参数,不包括body里的参数),根据参数名称的ASCII码表的顺序排序。如:foo=1, bar=2, foo_bar=3, foobar=4排序后的顺序是bar=2, foo=1, foo_bar=3, foobar=4。
    • 将排序好的参数名和参数值拼装在一起,根据上面的示例得到的结果为:bar2foo1foo_bar3foobar4。
    • 包含Body(JSON)参数的请求,需要将json的key按ASCII排序(每一级的key都需要排序),再转为字符串,例如:

    {“b”:2, “d”:4, “a”:1, “c”:{

    展开全文
  • java生成md5密码加盐

    2021-07-10 01:56:41
    java、springboot生成加盐md5密码
  • MD5加密加盐-java

    2021-02-25 19:56:54
    **/ public class Md5Utils { /** * 加盐MD5加密 * * * @Title : getSaltMD5 * * * @Description : TODO * */ public static String getSaltMD5(String password) { // 生成一个16位的随机数 Random random = new ...

    package com.dq.online.onlinezuul.util;

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

    import java.security.MessageDigest;

    import java.util.Random;

    /**

    * @Author Allen.Lv

    * @Description //TODO

    * @Date 13:43 2019/4/1

    * @Desc: Coding Happy!

    **/

    public class Md5Utils {

    /**

    * 加盐MD5加密

    *

    *

    * @Title : getSaltMD5

    *

    *

    * @Description : TODO

    *

    */

    public static String getSaltMD5(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);

    }

    /**

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

    *

    *

    * @Title : md5Hex

    *

    *

    * @Description : TODO

    *

    */

    // @SuppressWarnings("unused")

    private static String md5Hex(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 "";

    }

    }

    /**

    * 验证加盐后密码是否还相同

    * @param password

    * @param md5str

    * @return

    */

    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));

    }

    }

    展开全文
  • md5加密,md5加盐加密和解密

    千次阅读 2021-02-26 13:48:14
    }/*----------------md5加盐加密和解密*/ /*** 获得加密后的16进制形式口令 *@parampassword *@return*@throwsException *@throwsNoSuchAlgorithmException *@throwsUnsupportedEncodingException*/ public static ...

    packagecom.java.test;importjava.security.MessageDigest;importjava.security.SecureRandom;importjava.util.Arrays;public classTest {private static final Integer SALT_LENGTH = 12;/*** 16进制数字*/

    private static final String HEX_NUMS_STR="0123456789abcdef";/*----------------md5普通加密*/

    /***

    * MD5加密 生成32位md5码

    *@param待加密字符串

    *@return返回32位md5码*/

    public static String md5Encode(String inStr) throwsException {

    MessageDigest md5= null;try{

    md5= MessageDigest.getInstance("MD5");

    }catch(Exception e) {

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

    e.printStackTrace();return "";

    }byte[] byteArray = inStr.getBytes("UTF-8");byte[] md5Bytes =md5.digest(byteArray);

    StringBuffer hexValue= newStringBuffer();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));

    }returnhexValue.toString();

    }/*----------------md5加盐加密和解密*/

    /*** 获得加密后的16进制形式口令

    *@parampassword

    *@return*@throwsException

    *@throwsNoSuchAlgorithmException

    *@throwsUnsupportedEncodingException*/

    public static String getEncryptedPwd(String password) throwsException{try{//声明加密后的口令数组变量

    byte[] pwd = null;//随机数生成器

    SecureRandom random = newSecureRandom();//声明盐数组变量

    byte[] salt = new byte[SALT_LENGTH];//将随机数放入盐变量中

    random.nextBytes(salt);//获得加密的数据

    byte[] digest =encrypte(salt,password);//因为要在口令的字节数组中存放盐,所以加上盐的字节长度

    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进制字符串格式的口令

    returnbyteToHexString(pwd);

    }catch(Exception e){throw new Exception("获取加密密码失败",e);

    }

    }/***

    * 根据盐生成密码

    *@paramsalt

    *@parampasswrod

    *@return*@throwsException

    *@throwsUnsupportedEncodingException

    *@throwsNoSuchAlgorithmException*/

    public static byte[] encrypte(byte[] salt,String passwrod) throwsException{try{//声明消息摘要对象

    MessageDigest md = null;//创建消息摘要

    md = MessageDigest.getInstance("MD5");//将盐数据传入消息摘要对象

    md.update(salt);//将口令的数据传给消息摘要对象

    md.update(passwrod.getBytes("UTF-8"));//获得消息摘要的字节数组

    returnmd.digest();

    }catch(Exception e){throw new Exception("Md5解密失败",e);

    }

    }/*** 将指定byte数组转换成16进制字符串(大写)

    *@paramb

    *@return

    */

    public static String byteToHexString(byte[] bytes) {

    StringBuffer md5str= newStringBuffer();//把数组每一字节换成16进制连成md5字符串

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

    digital=bytes[i];if(digital < 0) {

    digital+= 256;

    }if(digital < 16){

    md5str.append("0");

    }

    md5str.append(Integer.toHexString(digital));

    }returnmd5str.toString();

    }/*** 验证口令是否合法

    *@parampassword

    *@parampasswordInDb

    *@return*@throwsException

    *@throwsNoSuchAlgorithmException

    *@throwsUnsupportedEncodingException*/

    public static boolean validPassword(String password, String passwordInDb) throwsException {try{//将16进制字符串格式口令转换成字节数组

    byte[] pwdInDb =hexStringToByte(passwordInDb);//声明盐变量

    byte[] salt = new byte[SALT_LENGTH];//将盐从数据库中保存的口令字节数组中提取出来

    System.arraycopy(pwdInDb, 0, salt, 0, SALT_LENGTH);//获得加密的数据

    byte[] digest =encrypte(salt,password);//声明一个保存数据库中口令消息摘要的变量

    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;

    }

    }catch(Exception e){throw new Exception("密码验证失败",e);

    }

    }/*** 将16进制字符串转换成字节数组(大写)

    *@paramhex

    *@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]));

    }returnresult;

    }public static void main(String[] args) throwsException {//经过md5加盐加密的123字符串为str123//System.out.println(getEncryptedPwd("123"));

    String str123_1 = "3fc7ed92dfb924f56ece855e74bf9c5c0c1f6f72a4dcc4a7db943bf0";//123加盐加密

    String str123_2 = "7dd3e5af8b373221a9864df5c2b46208fb819a256398a59deec5cb09";//123加盐加密//比对 输入登录秘密 和 数据库加盐加密密码

    boolean isTrue1 = validPassword("123",str123_1);boolean isTrue2 = validPassword("123",str123_2);boolean isTrue3 = validPassword("1231",str123_2);

    System.out.println("验证密码结果:"+isTrue1);//true

    System.out.println("验证密码结果:"+isTrue2);//true

    System.out.println("验证密码结果:"+isTrue3);//fase

    }

    }

    展开全文
  • 一个简单的MD5加盐算法,对存入数据库的密码进行加密达到保护用户信息的作用
  • MD5密码加盐处理

    2020-11-12 11:07:30
    import org.apache.commons.codec.binary.Hex; import java.security.MessageDigest;... * 加盐MD5加密 * <p> * * @Title : getSaltMD5 * </p> * <p> * @Description : TODO * </p>
  • MD5—加密,加盐

    2021-01-19 02:49:54
    packagecom.demo.tools;importjava.security.MessageDigest;importjava.security..../***@authorxdx14 MD5加密工具类*/public classMD5Utils {/*** 获取32位数的MD5加密**@parampwd* 需要加密的字符串*...
  • C# .NET MD5加盐加密

    2021-04-21 16:56:26
    //var account = model.Set<...string pwd = MD5Helper.MD5Encoding(user.Password, account.Salt); if (pwd != account.Password) { return ; } using System; using System.Security.Cryptog...
  • 1.创建Md5加密类继承PasswordEncoder public class Md5PasswordEncoder implements PasswordEncoder { private final static String[] HEX_DIGITS = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b...
  • MD5密码加盐

    千次阅读 2019-08-19 09:44:27
    //加盐,并将加过盐的密码 和盐重新存入数据库中 String salt = MD5Utils.getSalt(); String password = MD5Utils.md5(user.getPassword()+salt); user.setPassword(password); user.setSalt(salt); userDAO....
  • 用Java实现MD5加盐

    万次阅读 多人点赞 2019-06-03 20:32:32
    加盐就是向明文中加入随机数,然后在生成MD5,这样一来即使明文相同,每次生成的MD5码也不同,如此就加大了暴力破解的难度。 3、java实现 package md5; import java.security.MessageDigest; import java.s...
  • Java实现 MD5加盐加密 和 MD5和SHA-1混合加盐加密

    万次阅读 多人点赞 2018-08-25 14:51:23
    现在一般的MD5加密在网上随随便便就能够解密,解密的网站有以下几个: http://pmd5.com/ http://www.cmd5.com/ http://tool.chinaz.com/tools/md5.aspx ... 实现方式一:MD5加盐加...
  • Python进行MD5加密 加盐

    千次阅读 2019-05-14 22:53:11
    Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and ...
  • ios MD5加盐加密

    千次阅读 2018-11-26 14:51:39
    MD5加密 是HASH算法一种、 是生成32位的数字字母混合码。 MD5主要特点是 不可逆 MD5算法还具有以下性质: 1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。 2、容易计算:从原数据计算出MD5值很容易。 3、...
  • 密码加盐MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。 是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),...
  • md5 加盐原理和常用的加盐方法

    万次阅读 2018-06-08 10:07:04
    更好地保护用户的密码和个人帐户安全(一个用户可能会在多个系统中使用同样的密码,因此涉及到用户在其他网站和系统中的数据安全),需要对MD5摘要结果掺入其他信息,称之为加盐加盐的算法有很多,考虑到加盐的...
  • C#MD5加盐加密

    2021-01-07 13:38:46
    C#加盐加密前言一、MD5加盐加密是什么?二、使用步骤1.引入库 加盐加密一般使用在添加用户方法中总结 前言 MD5加盐加密 提示:以下是本篇文章正文内容,下面案例可供参考 一、MD5加盐加密是什么? MD5(Message ...
  • java实现MD5加盐加密方法

    万次阅读 2018-03-20 14:46:53
    一、MD5如何使用Java代码生成第一、 得到原始数据的数据指纹第二、 因为的到数据指纹是乱码的,所以要通过base64编码成明文字符二、应用场景:密码加密 软件校对是否已修改过 获得指定长度的随机数 ……… ……...
  • MD5加密 MD5加盐

    千次阅读 2019-09-23 10:19:26
    MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。...
  • MD5加密并加盐,加强安全

    千次阅读 2019-01-24 15:11:27
    加盐 package com.sj.common; import java.security.MessageDigest; public class PasswordEncoder { private final static String[] hexDigits = { "0", "1", "...
  • MD5加盐

    万次阅读 多人点赞 2018-07-05 17:12:00
    还有人会说MD5+salt(就是俗称的加盐)不安全,理由是MD5运算很快云云。这样说的人,肯定不知道MD5+salt要避免的问题是什么,或者说MD5+salt为什么就安全了,甚至大概连MD5+salt的salt是个什么东西,应该怎么个加法...
  • C++实现MD5摘要算法加盐salt值 1.信息摘要函数 1.1Hash函数 哈希函数就是能将任意长度的数据映射为固定长度的数据的函数。哈希函数返回的值被叫做哈希值、哈希码、散列,或者直接叫做哈希。 1.2消息摘要 将长度不...
  • nodejs-md5加盐到解密比对

    千次阅读 2019-07-24 10:47:56
    nodejs-crypto-md5加盐到解密比对
  • MD5加盐加密

    2021-03-16 16:13:34
    标签:package ...import java.security.NoSuchAlgorithmException;import java.util.Random;/**** MD5* @author WXW**/public class MD5Util {private final String chars = "ABCDEFGHIJKLMNOPQRSTUVWX...
  • Java实现MD5加盐加密算法

    万次阅读 2017-12-27 15:48:29
    《 Java实现MD5加盐加密算法 》 现在一般的MD5加密在网上随随便便就能解密,解密的网站有以下一个:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,357
精华内容 5,742
关键字:

加盐md5