对于用户密码的加密

  这篇文章也是在做项目的时候使用到的内容,来做成一篇博客

(一)加密是什么?

  我们在https中也说到了加密,因为https就是http加密后的产物,当时又说到了运营商劫持,然后引出加密,然后加密的方法---对称加密,又因为要传输密钥,引入非对称加密(公钥私钥),但是又可能会有中间人攻击(中间人伪造成服务器)又引入了证书一系列的东西

  上述是基于http加密去讲解的,那这里我们再来基于密码加密讲解一下

  在mysql数据库中,我们就需要对密码,手机号这些敏感的信息进行加密,因为如果使用明文存储时,当用户侵入数据库,就可以直接全部获取到,我们为了避免这种情况就需要对存入的隐私数据进行加密

  密码算法分类

  那密码算法主要分为三类:对称密码算法,非对称密码算法,摘要算法

  对称密码算法:就是加密密钥和解密密钥一样的密码算法,常见的对称密码算法:RC4,RC5,AES,DES等

  非对称密码算法:就是加密密钥和解密密钥不一样的密码算法,分为公钥和私钥,该算法就是把公钥放出去,你们通过公钥加密然后把信息传给我,我再通过密钥解密,常见的非对称密码算法:RSA,DSA等

  摘要算法:就是把任意长度的输入消息数据转化为固定长度的输出数据的算法,这个算法是不可逆的,也就是不可解密,所以这个算法一般只用来判断是否相等,我们如果使用这算法存数据,我们自己在数据库中就也不知道真实的值(所以可以用来在数据库中存密码,即使被黑了数据库,他也不知道密码),常见的摘要算法:MD5,SHA,CRC等

加密思路

   这里我们使用md5算法进行加密

   但是还有一个问题就是,虽然md5加密后的密文无法解密,但是相同的密码,生成的MD5数据是一样的,然后有一些用户的密码是很短的,这就会导致他们的密码会重复,又因为很短导致黑客可以相对简单的破解,所以我们要考虑对用户输入的密码进行一层包装,然后再进行加密

  那我们加一层包装要怎么加?像上篇博客中JWT令牌那样,生成一个随机字符串后,把他变为静态的常量,放到密码前包装一下进行加密?虽然这样是可以加强用户密码的复杂度,大大加强了黑客的破解难度,但是还是存在一个问题就是破解了一个用户的信息,就会更容易破解其他用户的信息。

  解决方案:

    我们这里采用的是密码拼接“随机”字符串来进行加密,这个随机字符我们称之为‘盐’,这样黑客拿到了这个加密串就不是很好破解了

  

   上述图还少了最后一步,加密算法后我们要保存我们的盐值方便我们下一次解密,所以我们服务器存储的是盐值+密文

 解密流程:

  因为md5不可逆,所以只能我们是通过判断盐值+用户输入的密码进行加密算法后得到的数据,是否与密文相同

(二)写加密/解密工具类

 1.对密码进行加密

 public static String encrypt(String password){String salt = UUID.randomUUID().toString()    //生成随机盐值.replace("-", "");   //将生成字符串中间的-替换为“”String finalPassword =DigestUtils.md5DigestAsHex((salt + password).getBytes());return salt+finalPassword;      //返回盐值+(盐值和密码生成的字符串)}

   这里的uuid生成了随机盐值 是这样的,当我们把-去掉,固定的长度就是32位了,正好与我们MD5,算法生成的随机字符串长度相同

 

 然后我们通过MD5算法把盐值+密码生成了一个密文,并返回盐值+密文

2.对密码进行解密

  我们上面说生成的盐值是32位,md5生成的密文也是32位的,那返回的盐值+密文就是64位,如果不是那就是有错误了

  然后我们拿到前32的盐值,并且跟我们传入的密码进行加密然后拼接盐值,判断和数据库中存入的密码是否相等,如果相等的话,就说明密码是正确的

 public static Boolean verify(String password,String finalPassowrd){if(!StringUtils.hasLength(password)||!StringUtils.hasLength(finalPassowrd)){return false;}if(finalPassowrd.length()!=64)return false;String salt=finalPassowrd.substring(0,32);String thisPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());return (salt+thisPassword).equals(finalPassowrd);}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/884894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL拦截(二)InnerInterceptor

一、介绍 1、简介 InnerInterceptor 接口是 MyBatis-Plus 提供的一个拦截器接口,用于实现一些常用的 SQL 处理逻辑。 二、API InnerInterceptor 接口继承自 MyBatis 的 Interceptor 接口,并添加了一些新的方法,用于处理 MyBatis-Plus 的特…

Hive数据库操作语法

数据类型 内部表和外部表 内部表 (CREATE TABLE table_name ......)未被external关键字修饰的即是内部表, 即普通表。 内部表又称管理表,内部表数据存储的位置由hive.metastore.warehouse.dir参数决定(默认:/user/h…

2024年最新crm系统TOP10!

在当今竞争激烈的商业环境中,维持良好的客户关系是企业成功的关键所在。CRM(客户关系管理)系统已成为帮助企业优化客户关系、提高客户满意度和增加业务收入的有力工具。随着技术的不断进步,2024年最新的CRM系统提供了更先进的功能…

车载通信架构 --- PNC、UB与信号的关系

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

CLIP-Driven Universal Model for Organ Segmentation and Tumor Detection论文解读和实验复现

背景 医学图像数据集的增长:随着公开的医学图像数据集数量的增加,自动化器官分割和肿瘤检测技术得到了显著发展。数据集的局限性:尽管数据集数量增加,但每个数据集通常规模较小,且存在部分标注问题。这意味着不是所有…

如何使用Varjo直接观看Blender内容

最近,开源的3D建模程序Blender为Varjo提供了出色的OpenXR支持,包括四视图和凹进渲染扩展。但是在Blender中,默认不启用VR场景检查。要开始使用VR场景检查,只需遵循以下步骤: 1. 下载并安装Blender 2.启用Blender VR场景…

Go 语言之搭建通用 Web 项目开发脚手架

Go 语言之搭建通用 Web 项目开发脚手架 MVC 模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。 Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑&…

【LeetCode】【算法】160.相交链表

Leetcode 160. 相交链表 题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 思路 AB,一个指针,访问完A访问B;另一个指针&#…

[UUCTF 2022 新生赛]ezpop 详细题解(字符串逃逸)

知识点: php反序列化字符串逃逸 php反序列化魔术方法 构造pop链 变量引用 其实这一题还是比较简单的,只要看懂代码,并且理解为什么要用反序列化字符串逃逸,下面会详细解释 题目源码: <?php //flag in flag.php error_reporting(0); class UUCTF{public $name,$key,$…

Python爬虫基础-正则表达式!

前言 正则表达式是对字符串的一种逻辑公式&#xff0c;用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则的字符串”&#xff0c;此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在&#xff0c;而非python独有。对其知识点…

从 HTTP 到 HTTPS 再到 HSTS:网站安全的演变与实践

近年来&#xff0c;随着域名劫持、信息泄漏等网络安全事件的频繁发生&#xff0c;网站安全变得越来越重要。这促使网络传输协议从 HTTP 发展到 HTTPS&#xff0c;再到 HSTS。本文将详细介绍这些协议的演变过程及其在实际应用中的重要性。 一、HTTP 协议 1.1 HTTP 简介 HTTP&…

Oracle 第15章:安全性管理

在Oracle数据库中&#xff0c;安全性管理是一个至关重要的方面&#xff0c;它确保了数据的完整性和机密性。第15章通常会涵盖用户权限、角色分配、数据库审计和安全策略等内容。下面我会概述这些主题&#xff0c;并提供一些示例来帮助理解。 用户权限与角色 用户权限 在Orac…

AI之硬件对比:据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D

AI之硬件对比&#xff1a;据传英伟达Nvidia2025年将推出RTX 5090-32GB/RTX 5080-24GB、华为2025年推出910C/910D 目录 Nvidia的显卡 Nvidia的5090/5080/4090/4080&#xff1a;据传传英伟达Nvidia RTX 5090后续推出32GB版且RTX 5080后续或推出24GB版 RTX 5090相较于RTX 4090&…

SRS:构建实时免费视频服务器的全方位指南

SRS&#xff08;Simple Realtime Server&#xff09;是一个开源的、基于MIT协议的实时视频服务器&#xff0c;以其简单、高效而著称。它支持多种流媒体协议&#xff0c;包括RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH和GB28181等&#xff0c;使其成为直播和WebRTC领域的理想…

Go 语言的错误处理

1. 引言 在任何编程语言中,错误处理都是一个至关重要的部分。在 Go 语言中,错误处理方式独具特色,它并没有采用异常处理机制(try-catch),而是通过显式的错误返回值来处理错误。这种方式让代码更加明确、易于维护,也使得错误处理更加透明。 在这篇博客中,我们将深入探…

Day95 Docker

Docker的使用 1、Docker是什么 docker是一个用来管理镜像的容器 容器(container)&#xff1a;可以装东西 镜像( image )&#xff1a;所谓的镜像&#xff0c;你可以认为就是一个虚拟机 虚拟机&#xff1a;用软件代理硬件来模拟整个计算机的这样一套软件就成为 虚拟机 镜像说白了…

Imperva 数据库与安全解决方案

Imperva是网络安全解决方案的专业提供商&#xff0c;能够在云端和本地对业务关键数据和应用程序提供保护。公司成立于 2002 年&#xff0c;拥有稳定的发展和成功历史并于 2014 年实现产值1.64亿美元&#xff0c;公司的3700多位客户及300个合作伙伴分布于全球各地的90多个国家。…

搜维尔科技:【煤矿虚拟仿真】煤矿企业、高校、科研单位-多语言支持、数字孪生、交互式学习体验

品牌&#xff1a;SouVR 发票&#xff1a;支持专票、普票 单位&#xff1a;套 版本号&#xff1a;1.0 包装清单&#xff1a;软件1套 软件形式&#xff1a;U盘、光盘 运行环境&#xff1a;windows 应用对象&#xff1a;煤矿企业、高校、科研单位 系统配置&#xff1a;…

[C++]——哈希(附源码)

目录 ​编辑 ​编辑 一、前言 二、正文 2.1 unorder系列关联式容器 2.1.1 unordered_map 2.1.1.1 unorderer_map的介绍 ①unordered_map的构造 ②unordered_map的容量 ③unordered_map的迭代器 ④unordered_map的元素访问 ⑤unordered_map的查询 ⑥unordered_map的修改操…

Linux:防火墙和selinux对服务的影响

1-1selinux 1-1 SELinux是对程序、文件等权限设置依据的一个内核模块。由于启动网络服务的也是程序&#xff0c;因此刚好也 是能够控制网络服务能否访问系统资源的一道关卡。 1-2 SELinux是通过MAC的方式来控制管理进程&#xff0c;它控制的主体是进程&#xff0c;而目标则是…