项目安全问题及解决方法------用户密码处理

我们一般来说是不保存原始密码,这样即使被拖库也不会造成用户数据损失,一般来说我们通常会使用 MD5 加密后保存,但是大家对于MD5是使用是否 是正确的呢?MD5 其实不是真正的加密算法。所谓加密算法,是可以使用密钥把明文加密为密文,随后还可以使用密钥解密出明文,是双向的。而 MD5 是散列、哈希算法或者摘要算法。不管多长的数据,使用 MD5 运算后得到的都是固定长度的摘要信息或指纹信息,无法再解密为原始数据。所以,MD5 是单向的。最重要的是,仅仅使用 MD5 对密码进行摘要,并不安全。

UserData userData = new UserData();
userData.setId(1L);
userData.setName(name);
//密码字段使用MD5哈希后保存
userData.setPassword(DigestUtils.md5Hex(password));
return userRepository.save(userData);

"password": "325a2cc052914ceeb8c19016c091d2ac"

即使多次的MD5也会不很安全。

userData.setPassword(DigestUtils.md5Hex(DigestUtils.md5Hex( password)));

"password": "ebbca84993fe002bac3a54e90d677d09"

 

所以保存 MD5 后的密码是不安全的,我们一般会加入盐值。但是盐值的生成是有一定规则的:

• 盐值是不能写死的。

userData.setPassword(DigestUtils.md5Hex("salt" + password));

"password": "58b1d63ed8492f609993895d6ba6b93a"

 此时,黑客可以自己注册一个账号,使用一个简单的密码,比如 1,生成的密码是 "password": "55f312f84e7785aa1efa552acbf251db"

由此我们得知盐值就是salt

• 每个人的盐值不要设置相同,建议采用随机值

userData.setSalt(UUID.randomUUID().toString()); userData.setPassword(DigestUtils.md5Hex(userData.getSalt() + password));  

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

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

相关文章

【Uni-App】运行微信小程序时报错routeDone with a webviewId 2 that is not the current page

使用HBuilderX开发微信小程序,运行项目的时有可能会出现routeDone with a webviewId 1 that is not the current page的报错,但不影响运行。如果强迫症介意的话,可以考下面的方法进行修复。 产生原因 由于微信开发者工具的调试基础库处于灰度…

CTF盲水印工具:Blind-WaterMark安装

工具下载地址:GitCode - 开发者的代码家园 下载完毕后,只留这些东西就行 接下来需要安装两个依赖: opencv、matplotlib 直接pip install安装的话,工具使用会报错 所以需要到网站里挑选适合的版本进行安装 下载地址&#xff1…

GmSSL - GmSSL的编译、安装和命令行基本指令

文章目录 Pre下载源代码(zip)编译与安装SM4加密解密SM3摘要SM2签名及验签SM2加密及解密生成SM2根证书rootcakey.pem及CA证书cakey.pem使用CA证书签发签名证书和加密证书将签名证书和ca证书合并为服务端证书certs.pem,并验证查看证书内容: Pre Java - 一…

Java基础 集合(五)Set详解

目录 简介 set种类 AbstractSet 抽象类 SortedSet 接口 HashSet LinkedHashSet TreeSet 前言-与正文无关 生活远不止眼前的苦劳与奔波,它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中,我们往往容易陷入工作的漩涡&#xff…

缓存框架jetcache

在实际应用中,并不是单一的使用本地缓存或者redis,更多是组合使用来满足不同的业务场景。 jetcache组件实现了优雅的组合本地缓存和远程缓存。 支持多种缓存类型:本地缓存、分布式缓存、多级缓存。 官网地址:https://github.com…

[.NET] 查询当前已安装所有 Win32 与 UWP 应用

为了获取当前设备用户已安装的所有应用程序, 一般来讲有两种方案. 一种是通过查询 “shell:AppsFolder” 目录下所有项, 一种是从开始菜单中获取所有快捷方式, 然后加上查询所有已安装的 UWP 应用, 最后得到总列表. 如需代码参考, 请看 github.com/SlimeNull/WindowsAppsQuery …

网工内推 | 港企、合资公司,厂商认证优先,五险一金

01 九龙仓(长沙)置业有限公司 招聘岗位:IT网络工程师 职责描述: 1.负责公司网络架构规划设计、设备选型、远程组网方案的规划和设计; 2.负责公司网络IP地址规划管理,根据业务需求和公司状况,对…

PAT-Apat甲级题1004(python和c++实现)

PTA | 1004 Counting Leaves 1004 Counting Leaves 作者 CHEN, Yue 单位 浙江大学 A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child. Input Specification: Each input file contains one te…

2024美赛数学建模B题思路源码

赛题目的 赛题目的: 问题描述: 解题的关键: 问题一. 问题分析 要开发一个模型来预测潜水器随时间的位置,我们需要考虑以下几个关键因素: 海洋环境因素:当前和预测的洋流、海水密度(可能会随…

springboot 整合 AOP切面编程

文章目录 什么是AOP切面编程AOP中重要概念切面连接点通知切入点 springboot的切面编程的步骤引入切面编程依赖开发附加操作(在springboot项目新建config配置) 什么是AOP切面编程 所谓AOP就是一种编程范例,我们一般做一个项目,会分为很多个模块&#xff…

人工智能基础-Numpy的arg运算-Fancy Indexing-比较

索引 获取最小值最大值索引 np.argmin(x) np.argmax(x)排序和使用索引 np.sort(x)Fancy Indexing 索引 二维数组的应用 numpy.array 的比较 比较结果和Fancy Indexing

在Django Admin添加快捷方式django-admin-shortcuts

在Django管理主页上添加简单漂亮的快捷方式。 1.安装 pip install django-admin-shortcuts 2在settings.py注册django-admin-shortcuts INSTALLED_APPS [admin_shortcuts,django.contrib.admin,....... ] 3.添加ADMIN_SHORTCUTS设置 ADMIN_SHORTCUTS [ { ti…