【密码加密原则三】

news2024/12/25 12:49:07

目录

1 密码加密原则(续)

1.1 盐值的优化

1.2  Mybatis中的占位符


1 密码加密原则(续)


1.1 盐值的优化

为了进一步保障密码安全,可以考虑使用随机的盐值,但是,需要注意,随机的盐值必须保存下来,否则,当“注册”时使用随机盐进行编码得到密文,后续“登录”时在无法得到相同盐值的情况下,无法编码得到相同的密文,会导致注册的账号无法经过密码验证来登录!

示例:


@Test
void encode() {
    String salt = UUID.randomUUID().toString()
            .replace("-", ""); // 盐值
    String rawPassword = "123456";
    String encodedPassword = DigestUtils.md5DigestAsHex(
            (rawPassword + salt).getBytes());
    System.out.println("盐值:" + salt);
    System.out.println("原文:" + rawPassword);
    System.out.println("密文:" + (salt + encodedPassword));
    // 5571de817ae548439e21b25c51dc355d8dcf37525ca32a3916b56b7db1f15051
    // 1451c0a6320d4aacbd2453862a354e7c7cd8c5ad0d09027f0fc64f0ce52cf2df
}

@Test
void matches() {
    String rawPassword = "123456";
    String dbPassword = "1451c0a6320d4aacbd2453862a354e7c7cd8c5ad0d09027f0fc64f0ce52cf2df";

    String salt = dbPassword.substring(0, 32);
    String encodedPassword = DigestUtils.md5DigestAsHex(
            (rawPassword + salt).getBytes());
    System.out.println("盐值:" + salt);
    System.out.println("原文:" + rawPassword);
    System.out.println("密文:" + (salt + encodedPassword));
    System.out.println("验证结果:" + dbPassword.equals(salt + encodedPassword));
}
 

但是,以上做法仍无法抵御“穷举式的暴力破解”,在这种破解手段面前,是完全无视加密时使用的算法的,而是直接通过你设计算法,一个个的去尝试,直至“试”正确的原始密码。

针对暴力破解,最有效的手段就是:验证码、对恶意访问的客户端实施禁止访问的机制(例如封IP等、封账号)。

另外,还可以使用一些更加安全的算法,来避免被暴力破解!有些用于处理密码加密的算法被刻意的设计成“非常慢”的算法!例如`BCrypt`算法就是非常慢的(个人电脑,每秒13次左右):


BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

@Test
void encode() {
    String rawPassword = "123456";
    System.out.println("原文:" + rawPassword);

    String encodedPassword = passwordEncoder.encode(rawPassword);
    System.out.println("密文:" + encodedPassword);

    // 密文:$2a$10$Ns6YHxeVxdG1aFLkSX/0e.xT9QMKte/wZBIv.fZ/mhNxP7K8RvzPC
    // 密文:$2a$10$TpWV/CzbsTP/nYvmjH3BjuXBjnZUHJ6dkWO8/0CORsXFzIQUojw9K
    // 密文:$2a$10$7LIZM.IxoUy9e1NSkqHEF.7SkeRbvNlNtnlRqY6rUssVNa1T36KAm
    // 密文:$2a$10$6c7EETFK/iRlt3iAxBhsZu/OTFrSo8RZWzGPRJVuCHGek2ms4M71S
    // 密文:$2a$10$LOXtGYZF.MYlrbcDlJ/Q4Okj6VXOV9V3dHNtaAxEbXcZzG2K1Dha2
    // 密文:$2a$10$p8gHsRqNUXUE1l4JFHH.4uDkpu7WArXpPiU4Dxhf2tv.o3BK7PBem
    // 密文:$2a$10$VHAAkbg4cbTfzvP6WiMH8eo95f2j3VKlDtD4t.SmtOjucOIDsuZj2
    // 密文:$2a$10$Pnsmkc8jV.6sILuO4hfb9ui7rpHx2Qk/cj5YBr1YIr.jiRCuKpJ2i
    // 密文:$2a$10$l56hXamC5cGxBsYBcOHfg.g1XbVM21YfWq.4oWm2PUypTfgRrv3O.
    // 密文:$2a$10$iyyAWxSQnG8DNd8qbMon0.gCxy5c7uzxBP3tZOFPIcFg5LxcunIEC
}

@Test
void matches() {
    String rawPassword = "123456";
    System.out.println("原文:" + rawPassword);

    String encodedPassword = "$2a$10$7LIZM.IxoUy9e1NSkqHEF.7SkeRbvNlNtnlRqY6rUssVNa1T36KAm";
    System.out.println("密文:" + encodedPassword);

    System.out.println("验证结果:" + passwordEncoder.matches(rawPassword, encodedPassword));
}
 

提示:`BCrypt`算法本身也是使用了随机的盐值,且盐值是密码的一部分,所以,并不影响其验证密码。

基于`BCrypt`算法的特性(随机盐、非常慢),是目前主流的用于对密码进行加密并用于存储的算法!

提示:`BCrypt`算法本身已经非常安全,通常并不需要使用额外的处理机制,当然,如果你还不放心,也可以继续加盐,或混合其它算法再次处理!通常,没有这个必要性!

1.2  Mybatis中的占位符

在使用Mybatis框架实现数据库编程时,在SQL语句的参数可以使用`#{}`的占位符来表示,例如:

```sql
DELETE FROM pms_album WHERE id=#{id}
```

其实,在`#{}`的大括号中的名称是可以完全随意填写的!例如写成`#{id}`,或`#{abcdefg}`,或`#{0}`等等,都是可以正确执行的!

之所以`#{}`中的名称可以随意填写,是因为以上SQL语句只有1个参数,Mybatis会自动的找到这个参数值用于执行SQL语句,无论名称是什么,都不会影响Mybatis找到这个参数值!

在**非Spring Boot项目**中,如果抽象方法的参数不只1个,默认情况下,Mybatis无法识别任何参数的名称,例如配置为:

```java
int updateNameById(Long id, String name);
```

```xml
<update id="updateNameById">
    update
        pms_album
    set
        name=#{name}
    where
        id=#{id}
</update>
```

执行时将出现错误,如下所示:

Caused by: org.apache.ibatis.binding.BindingException: Parameter 'name' not found. Available parameters are [arg1, arg0, param1, param2]

之所以出现这个错误,是因为所有`.java`文件在执行之前都需要被编译为`.class`文件,最终执行的是`.class`文件,而默认的编译行为会**丢弃所有局部的量(包含局部变量、方法的参数)的名称**!也就是说,以上代码在编译到`.class`文件中后,根本没有`id`、`name`这样的参数名称!

根据以上提示`Available parameters are [arg1, arg0, param1, param2]`,此时,只能使用`arg0`表示第1个参数,使用`arg1`表示第2个参数,或者,使用`param1`表示第1个参数,使用`param2`表示第2个参数……即`arg`开头是使用`0`开始顺序编号的,`param`开头是使用`1`开始顺序编号的,如果你的抽象方法有更多参数,也可以继续编号下去(无视以上信息中是否提示了)。

例如配置为:

```xml
<update id="updateNameById">
    update
        pms_album
    set
        name=#{arg1}
    where
        id=#{arg0}
</update>
```

在Spring Boot中,干预了编译过程,保留了参数名称,所以,在配置SQL语句时,可以在`#{}`中写参数的名称,例如:

```xml
<update id="updateNameById">
    update
        pms_album
    set
        name=#{name}
    where
        id=#{id}
</update>
```

个人主页:居然天上楼

感谢你这么可爱帅气还这么热爱学习~~

人生海海,山山而川

你的点赞👍 收藏⭐ 留言📝 加关注✅

是对我最大的支持与鞭策

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

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

相关文章

Java高效率复习-MySQL下篇[MySQL]

前言 本文章的语言描述会比上篇多一些 数据库的创建修改与删除 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量限制为29个必须只能包含A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;_等63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个My…

生产环境 Nginx后端服务大量TIME-WAIT的解决

netstat -n | awk /^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} ss -s netstat -nat |awk {print $6}|sort|uniq -c|sort -rn 统计TIME_WAIT 连接的本地地址 netstat -an | grep TIME_WAIT | awk {print $4} | sort | uniq -c | sort -n -k1 尝试抓取 tcp 包 tcpd…

工业CT之三维重建技术

目前&#xff0c;国内现有的工业CT设备绝大多数是基于线阵探测器的断层扫描技术。 该技术主要是通过观察二维图像去发现单层断面上的损伤部位&#xff0c;至于能准确地确定损伤部位的空间位置、大小、几何形状等&#xff0c;仅通过观察二维切片图像是很难实现的。 这个时候就需…

Flink系列之Flink中Checkpoint容错机制

title: Flink系列 三、Flink Checkpoint 容错机制原理概述 ​ Flink 提供了 Exactly once 特性&#xff0c;是依赖于带有 barrier 的分布式快照 可部分重发的数据源功能实现的。而分布式快照中&#xff0c;就保存了 operator 的状态信息。 ​ Flink 的失败恢复依赖于 检查点…

Zabbix技术分享——如何使用zabbix监控华为云RDS

在数字化大背景下&#xff0c;数据是重要的生产资料&#xff0c;这些数据存放在哪里&#xff0c;如何保障数据安全是所有企业都要考虑的事情。华为云RDS凭借安全可靠&#xff0c;可根据业务规模动态扩容的特性&#xff0c;受到越来越多中小企业的青睐&#xff0c;对华为云RDS监…

NR PUSCH power control(一)

这篇看下NR PUSCH power control的相关内容&#xff0c;主要内容集中在38.213 7.1章节&#xff0c;功率计算无非就是一个长公式&#xff0c;根据RRC配置的参数及后续DCI field 的内容作出功率的调整&#xff1b;最初这部分看的就云里雾里的&#xff0c;最近再看&#xff0c;相比…

upload-labs通关

upload-labs通关 shell &#x1f349; 目录upload-labs通关PASS-01、PASS-02PASS-03PASS-04PASS-05PASS-06PASS-07PASS-08PASS-09PASS-10PASS-11PASS-12PASS-13PASS-14PASS-15PASS-16PASS-17PASS-18PASS-19PASS-20PASS-21shell能上传并能解析就算成功 PASS-01、PASS-02 图片…

最近要考pmp,哪个培训机构比较好?

你说的几个都是我着重了解过的&#xff0c;作为过来人&#xff0c;把我做的各大机构的优缺点给你参考吧~ PMP 机构排名的话&#xff0c;没有官方数据&#xff0c;网上数据仅供参考。这篇机构对比的文章&#xff0c;主流机构都有&#xff0c;你可以看看 下面说下我收集的每个机…

【数据库数据恢复】无法启动MongoDB服务的数据恢复案例

关于MongoDB数据库&#xff1a; MongoDB数据库存储方式是将文档存储在集合之中&#xff0c;而不是像Oracle、MySQL一样的关系型数据库。 MongoDB数据库是开源数据库&#xff0c;也提供具有附加功能的商业版本。 MongoDB中的数据是以键值对(key-value pairs)的形式显示的&…

[附源码]Python计算机毕业设计Django校友社交系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

“云办公”如何用任务协同工具搞定项目和团队管理?

导语&#xff1a;远程参加会议、团队协同作业、项目负责人进行任务分配、团队成员多人协同编辑文件及同时推进项目、人力部门在线进行审批报销……&#xff0c;随着“云办公”的加速普及&#xff0c;人们只需一台电脑、一部手机、一根网线&#xff0c;就能随时进入办公状态&…

云服务器及域名到期后,公安联网注销指南

云服务器及域名到期后&#xff0c;公安联网注销指南 公安联网备案及注销的操作流程都写在了官方文档中&#xff0c;可以进入全国互联网安全管理服务平台&#xff0c;在下载中心找到并下载 《互联网站安全服务平台操作指南》&#xff0c;按照操作指南进行备案及撤销。 以下图…

JS实现关闭图片窗口

JS实现关闭图片窗口 有趣的小案例池子&#xff1a; JS实现定时器 JS实现关闭图片窗口 JS实现输入检验 获取焦点后隐藏提示内容的输入框 JS实现获取鼠标在画布中的位置 聊天信息框显示消息 JS点击切换背景图 自动切换背景的登录页面 JS制作跟随鼠标移动的图片 JS实现记住用…

K8S Pod控制器详细讲解

文章目录一、Pod控制器介绍二、ReplicaSet(RS)三、Deployment(Deploy)1.镜像更新&#xff1a;2.版本回退3.金丝雀发布/灰度发布四、Horizontal Pod Autoscaler(HPA)五、DaemonSet(DS)六、Job七、CronJob(CJ)结尾一、Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在…

ArcGIS矢量化并进行拓扑检查

土地利用数据每年都在发生变化&#xff0c;故每年都要根据去年的数据进行修改。请根据以下要求&#xff0c;修改A区域的数据并对B区域已做好的数据进行拓扑检查。 01 数据说明 1. 地类图斑A.shp&#xff1a;A区域需要编辑修改的图斑数据。 2. 影像.tif&#xff1a;编辑A区域…

Docker数据卷自定义Docker镜像

目录 宿主机与容器之间的文件拷贝 引言&#xff1a;利用MySQL镜像安装MySQL服务 从容器中拷贝文件到宿主机 从宿主机拷贝文件到容器 数据卷 数据卷容器 Dockerfile自定义镜像 自定义tomcat8&#xff08;熟悉几乎所有的Dockerfile命令&#xff09; 宿主机与容器之间的文…

集群配置步骤_java培训

配置步骤 复制3个ZooKeeper zookeeper-3.4.9.tar.gz解压后拷贝到/myzookeeper目录下并重新名为zk01&#xff0c;再复制zk01形成zk02、zk03&#xff0c;共计3份 新增目录 进入zk01/02/03分别新建文件夹&#xff0c;mydata、mylog 新建配置文件 分别进入zk01-zk03各自的conf文件…

perflab 课程设计

初始状态 rotate 版本I 因为本题步步都在寻址而寻址的目标每一步又不同&#xff0c;并且在一个地址的值一次就赋值完毕&#xff0c;不会对同一个地址进行二次寻址&#xff0c;所以我首先想的改进方向就是使得寻址更加快速&#xff0c;于是我使得寻址的地址更加连续。 int i,…

【面试题】 javaScript 进阶之路 --- 《加深理解回调函数》

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 一. 函数 回调函数的基本概念我之前的文章虽然有些过&#xff0c;但是为了引入下文&#xff0c;在这里还是简单再提一嘴…

苹果电脑ntfs如何打开硬盘?mac能读取的硬盘格式

如今&#xff0c;使用Mac电脑的用户越来越多&#xff0c;但是不少用户却面临着一个问题&#xff0c;那就是Mac无法正常读写自己的NTFS格式的外置硬盘&#xff0c;硬盘上面保存着很多重要的文件数据&#xff0c;想要进行复制或者是编辑等&#xff0c;压根没有办法在Mac电脑上进行…