MD5加密
MD5是常用的加密算法,在用户注册时通过算法加密的密码存入数据库,保护用户密码,数据库管理员不能直接看见密码,即使用户数据库被盗,没有存储明文的密码对用户来说也多了一层安全保障。用户登录时,在客户端用户输入密码后,也会使用MD5进行加密,这样即使用户的网络被窃听,窃听者依然无法拿到用户的原始密码。

MD5加盐加密
把参数名和参数值拼接成一个字符串,同时把给定的密钥也拼接起来。之所以需要密钥,是因为攻击者也可能获知拼接规则。这里说的“密钥”也就是“盐”。

MD5加盐加密原理
MD5生成的哈希值是128位二进制数,32位16进制数

  1. 生成含有随机盐的字符串
    生成16位随机数,也就是盐
    将字符串与盐连接得到新的字符串,进入第二步
  2. 处理字符串:
    利用Java自带的加密类Message处理密码字符串,得到字节数组
    将字节数组转换成16进制数
    返回加密后的32位16进制数
  3. 处理32位进制数存入数据库
    将盐和32位字符串都存入数据库
  4. 验证
    从数据库读出字符串,处理成32位16进制数和盐,将盐和用户输入的密码再生成32位16进制数,与字符串提取的32位16进制数对比

Java代码实现

package com.neuedu.Utils;//import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
//import java.security.NoSuchAlgorithmException;
import java.util.Random;public class MD5Utils {/*** byte[]字节数组 转换成 十六进制字符串* * @param arr 要转换的byte[]字节数组** @return  String 返回十六进制字符串*/public static String hex(byte[] arr) {StringBuffer sb = new StringBuffer();for (int i = 0; i < arr.length; ++i) {sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));}return sb.toString();}/*** MD5加密,并把结果由字节数组转换成十六进制字符串* * @param str 要加密的内容* * @return String 返回加密后的十六进制字符串*/public static  String md5Hex(String str) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] digest = md.digest(str.getBytes());return hex(digest);} catch (Exception e) {e.printStackTrace();//System.out.println(e.toString());return "";}}/*** 生成含有随机盐的密码** @param password 要加密的密码** @return String 含有随机盐的密码*/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);}/*** 验证加盐后是否和原密码一致* * @param password 原密码* * @param password 加密之后的密码* *@return boolean true表示和原密码一致   false表示和原密码不一致*/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));}}

【Java】MD5加盐加密相关推荐

  1. java md5加盐与解密_md5加密,md5加盐加密和解密

    packagecom.java.test;importjava.security.MessageDigest;importjava.security.SecureRandom;importjava.u ...

  2. md5加密,md5加盐加密和解密

    package com.java.test;import java.security.MessageDigest; import java.security.SecureRandom; import ...

  3. MD5加盐加密工具类(可直接使用)

    MD5加盐加密工具类 在我们做项目时,涉及到用户密码,而正常来说数据库中不会直接存储明文的密码,都是加密之后的密码. 密码加密的方式有很多,比如: ① 3DES.AES.DES:使用对称加密算法,可以 ...

  4. 密码MD5加盐加密----注册、校验、修改模块

    思路:     单纯的MD5加密容易被碰撞破解,考虑将密码加上一个随机字符串(盐),再一同进行MD5加密,提高安全性. 此时,盐相当于另一半秘钥,需将盐一同存入数据库,用以验证. 实现过程:      ...

  5. MD5加盐加密工具类

    直接使用MD5加密,能被解密网站破解,因此在加密的时候可以加个盐值.工具类如下: import org.apache.commons.codec.binary.Base64; import java. ...

  6. ios MD5加盐加密

    MD5加密 是HASH算法一种. 是生成32位的数字字母混合码. MD5主要特点是 不可逆 MD5算法还具有以下性质: 1.压缩性:任意长度的数据,算出的MD5值长度都是固定的.2.容易计算:从原数据 ...

  7. SpringBooot MD5加盐加密

    String pwd = userInfo.getPassword();//随机生成密码盐(字符)String str = "abcdefghijklmnopqrstuvwxyzABCDEF ...

  8. mysql md5 加盐加密_MD5—加密,加盐

    packagecom.demo.tools;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException ...

  9. Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理

    前言 在开发的时候,有一些敏感信息是不能直接通过明白直接保存到数据库的.最经典的就是密码了.如果直接把密码以明文的形式入库,不仅会泄露用户的隐私,对系统也是极其的不厉,这样做是非常危险的. 那么我们就 ...

  10. 基于java注册登录MD5算法加盐加密颁发 Token身份令牌使用各种邮箱发送验证码详解雪花算法

    目的作用 == 在项目中,为了防止别人窥视我们的密码通常我们会采取一些加密方式.这里简单介绍一下MD5 加盐加密方法,MD5叫做信息-摘要算法,严格来说不是加密方式,而是信息摘要. 对于可以接触到数据 ...

最新文章

  1. mac中使用 sourcetree 的快速配置和git服务器登录
  2. asmack xmpp 获取离线消息
  3. Android中利用productFlavors配置多渠道
  4. 本机上的ajax需要跨域吗,jQuery AJAX跨域
  5. [Python] L1-025. 正整数A+B-PAT团体程序设计天梯赛GPLT
  6. svm各种工具箱(先放着了,省的找起来麻烦^.^)
  7. TestComplete自动化测试视频教程
  8. php jpgraph 中文,JPGraph 4.0(for PHP7)中文字体设置
  9. C++ string获取字符串元素:[]和at()
  10. 金格iweboffice2003,ie文档编写时无法自动提示安装问题解决
  11. python---字符串的拼接、去重、反转、字母花样排序、单词出现判断、统计文件特定单词频率lambda、硬盘容量、列表转字符串
  12. excel 如何删除有颜色的行
  13. 债券基金的涨跌受什么影响
  14. Alfred Workflow教程与实例
  15. 【淘宝API开发系列】获取商品详情,商品评论、卖家订单接口
  16. 数据结构课程设计(四):行车路线问题(C++、图、迪杰斯特拉算法、最短路径)
  17. 采用scp命令进行FTP数据迁移
  18. Hive窗口函数 row_number over()和sum() over()的使用详解
  19. Connection must be valid and open.
  20. 出现 DB2 SQL Error: SQLCODE = -798, SQLSTATE = 428C9 错误的原因及解决方法

热门文章

  1. 3道js面试题引发的脑洞
  2. 计算机有自带的拼音打字功能吗,搜狗拼音输入法 自带功能提升打字速度的技巧...
  3. 杜立特尔分解法 MATLAB,chase追赶法算法
  4. matlab 三对角矩阵 追赶法,计算方法追赶法解三对角矩阵方程
  5. OpenCV3编程入门(毛星云)读书笔记(一)
  6. spring定时器的简单实用
  7. Linux安装 deb包命令
  8. Photoshop 2021神经滤镜Neural Filters离线安装包下载 WIN / MAC(适用于PS 2021版本22.3.X/22.4.X)
  9. SGD和带momentum的SGD算法
  10. 计算机操作系统轮转算法代码,实验四 时间片轮转调度算法