1 当前端传送密码到后端时候,需要进行两次MD5加密,登录和注册时的加解密流程是怎么样的?

前端和后端加密都可以规定使用密码的某几位作为盐进行加解密操作,而这种约定俗成的盐选取操作只有程序员自己知道,所以安全性较高,不需要前后端传送盐。 或者是前端和后端开发人员在开发的时候商量好这个第一层加密的盐,分别在前端和后端存储起来,这样前端在每次发送密码的时候都使用md5配合盐进行加密,服务器因为知道盐,所以可以自然的解密出来。

答:
1 无论是注册还是登录,密码的第一次md5加密是在前端完成的,第二次加密都是在后端完成的,
2 对每一个用户的密码进行两次md5加密会使用到两个salt,第一个salt是公共的(前后端共享),被final static修饰,第二个salt则是专门为每一个用户随机生成的,会存到数据库user表中的salt字段中(这是为了方便日后登录时进行密码验证操作)。
3 再次强调 MD5 只是哈希,而不是加密。MD5 是没有可能解密的,因为一个 MD5 可能对应无数种可能的明文。

1.1 当用户第一次注册时

1 前端先使用全局公共的salt1将inputPass(用户输入的密码)先转换成fromPass(过渡密码),随后传给服务器,
2 服务器随机生成一个用户专属的salt2,使用md5和salt2将fromPass转换成dbPass(存储在数据库中的密码),
3 转换结束后,会将用户的注册信息(包含用户名和经过二次加密后的密码)以及专属salt2存到数据库中。

1.2 当用户使用用户名和密码进行登录时

1 前端会先使用公共的salt1对inpuPass进行第一次加密,得到fromPass并且传给服务器,
2 服务器根据用户名查找到其对应的专属salt2和password(用户首次注册时二次加密后的密码),利用这个salt2对用户的已经被公共盐加密过的密码进行二次加密,
3 与数据库中取出的密码进行比较,若一致,则登录成功,否则登录失败。

1.3 如果从对数据库中取出来的密码进行一层解密(即将密码第二次加密后的状态还原为第一次加密后的状态),为什么验证密码的时候,不是直接将这个解密后的密码同前端传过来的被加密后的密码进行比较,从而得出密码是否正确?

答:因为md5是利用hash进行加密的,这是一个不可逆的过程,即使知道hash的结果但是反向推导出hash函数的输入参数几乎是不可能的,所以。

以下是服务端实现两次md5加密的方法,inputPassToFromPass和inputPassToDBPass方法仅仅用于测试,在真实的业务场景中,前端传过来密码的永远不可能是明文密码,一定是经过inputPassToFromPass()方法加密后的密码

package utils;import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;import java.nio.charset.StandardCharsets;/*** MD5工具类** @author: LC* @date 2022/3/1 4:45 下午* @ClassName: MD5Util*/
@Component
public class MD5Util {public static String md5(String str) {return DigestUtils.md5DigestAsHex(str.getBytes(StandardCharsets.UTF_8));}private static final String salt = "1a2b3c4d";/*** 第一次加密** @param inputPass* @return java.lang.String* @author LC* @operation add* @date 4:49 下午 2022/3/1**/public static String inputPassToFromPass(String inputPass) {// salt可以随机的放在输入密码的各个部分当中String str = salt.charAt(0) + salt.charAt(2) + inputPass + salt.charAt(5) + salt.charAt(4);return md5(str);}/*** 第二次加密, 使用的盐需要重新生成(这个盐会存放到数据库中,成为用户的一个属性),* @author LC* @operation add* @date 4:52 下午 2022/3/1* @param formPass* @param salt* @return java.lang.String**/public static String formPassToDBPass(String formPass, String salt) {String str = salt.charAt(0) + salt.charAt(2) + formPass + salt.charAt(5) + salt.charAt(4);return md5(str);}/*** 将第一次加密和第二次加密调用* @param inputPass* @param salt* @return*/public static String inputPassToDBPass(String inputPass, String salt) {String fromPass = inputPassToFromPass(inputPass);String dbPass = formPassToDBPass(fromPass, salt);return dbPass;}public static void main(String[] args) {System.out.println(inputPassToFromPass("123456"));System.out.println(formPassToDBPass(inputPassToFromPass("123456"), "abcdefgh"));System.out.println(inputPassToDBPass("123456", "abcdefgh"));}
}

登录与注册时两次md5加密过程详解相关推荐

  1. python md5加密_Python MD5加密实例详解

    详解Python MD5加密 Python 3下MD5加密 # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待 ...

  2. HTTPS加密过程详解

    HTTPS加密过程详解 一.前言 二.HTTPS的混合加密 1.摘要算法 2.混合加密和数字证书 三.补充 四.参考资料 一.前言 http是为了解决http存在的问题而在http基础上加入了SSL/ ...

  3. HTTPS 加密过程详解

    HTTPS 加密过程详解 HTTPS 中的概念 对比 HTTP 与 HTTPS 网络分层结构 对称加密 非对称加密 HTTPS 中的概念 明文:可以直接看到原始数据的文本: 密文:看不见原始数据的文本 ...

  4. 安装mrt时怎么安装java_MRT安装过程详解之一:MRT硬件卡的安装和硬盘的连接

    MRT安装过程详解之一:MRT硬件卡的安装和硬盘的连接 用户在安装MRT的过程中可能会遇到一些问题,本文档介绍了MRT的详细安装过程,以及如何排除安装过程中的常见问题,以帮助用户正确的安装和使用MRT ...

  5. php 易语言md5加密解密,详解易语言调用js实现md5加密方法

    易语言调用js需要用到拓展组件的脚本组件, 在窗口创建完毕的事件里给脚本组件初始化设置下脚本组件的语言属性,在这里以JScript为例: 脚本组件执行脚本的简单方法是:  脚本组件1.执行 ()  然 ...

  6. 网络传输数据的加密过程详解

    常见的明文传输协议有:http,smtp,dns,pop3,imap4. 常见的攻击方式有:窃听,数据注入,会话劫持 为了保证互联网上的数据传输的安全性,于是各种的加密方式和加密算法诞生了: 数据加密 ...

  7. RSA加密过程详解 | 公钥加密| 密码学| 信息安全

    简介 RSA加密算法是一种非对称加密算法,所谓非对称,就是指该算法加密和解密使用不同的密钥,即使用加密密钥进行加密.解密密钥进行解密,分别称为公钥和私钥 在RAS算法中,公钥是公开的,而私钥是需要保密 ...

  8. https中SSL加密过程详解,看这一篇就够了!

    我们所说的https实际上就是安全版本的http,是http+ssl加密实现的. SSL握手协议 1.客户端:发起一个 HTTPS 请求,请给我公钥 2.服务器:这是我的证书,里面有加密后的公钥 3. ...

  9. android登录加密传输,android环境下两种md5加密方式(示例代码)

    在平时开发过程中,MD5加密是一个比較经常使用的算法,最常见的使用场景就是在帐号注冊时,用户输入的password经md5加密后,传输至server保存起来.尽管md5加密经经常使用.可是md5的加密 ...

最新文章

  1. 服务器返回的信息无效或无法识别的响应,c# - 服务器从Visual Studio返回了无效或无法识别的响应错误 - 堆栈内存溢出...
  2. 文巾解题 278. 第一个错误的版本
  3. python 数学建模、时间戳_python-在matplotlib中绘制Unix时间戳
  4. SQL Server 索引结构及其使用(一)[转]
  5. frame页面地址转向跨域解决方法
  6. oracle怎样查询某用户下的所有表的表名
  7. selenium+Java自动化
  8. 同时对view延时执行两个动画时候的现象
  9. Linux入门学习(七)
  10. 计算机采用逻辑元件的发展顺序是,全国计算机等级考试一级选择题以及答案
  11. windows curl ssl版本编译
  12. Python小游戏-接苹果
  13. Gartner:2015年启动的企业级区块链项目90%会失败,它们犯了这十大常见错误
  14. ES6:Rest 参数和参数默认值【转】
  15. [转载]在vim中针对c++自动补全
  16. 魅蓝a5 android版本,魅蓝A5低调问世,跑分3万、久用不卡,699元
  17. ad中电容用什么封装_【AD封装】贴片插件晶振(带3D)
  18. 颜色中英文对照表颜色名字色彩名称
  19. 安卓模拟器最优选择+抖音检测全绕过简述
  20. JeecgBoot 2.4.2 积木报表版本发布,基于SpringBoot的低代码平台

热门文章

  1. 《算法4》读书笔记(二)
  2. oracle数据库服务器02
  3. ‘SHIT’上最全有限状态机设计研究(一)-状态机介绍
  4. 如何利用大数据实现精准扶贫?
  5. 磁盘分区表(Partition Table)
  6. RSA--前端JS加密--后端JAVA解密
  7. a-upload上传图片
  8. 【机器学习】逻辑回归(理论)
  9. 使用Typora工具绘制流程图
  10. MiddleBury与SceneFlow 数据集相机参数与pfm文件解析