实现加盐加密方法以及java nio中基于MappedByteBuffer操作大文件

自己实现 

传统MD5可通过彩虹表暴力破解, 

加盐加密算法是一种常用的密码保护方法,它将一个随机字符串(盐)添加到原始密码中,然后再进行加密处理。

  • 1. 每次调用方法产生一个唯一盐值(UUID )+密码=最终密码。
  • 解密:需要验证的密码(用户输入的密码),最终加密的密码(存在于数据库)得到盐值,盐值存在最终密码的某个位置,——>盐值{32位}$最终密码{32位};
  •  2. 对组合后的字符串进行多次哈希计算,每次哈希时都使用盐值和先前的哈希值。哈希计算的次数由工作因子控制。

验证密码
已有:用户输入的明文密码、此用户在数据库存储的最终密码=[盐值$加密后的密码]
32位32位
1.从最终密码中得到盐值
2.将用户输入的明文密码+盐值进行加密操作=加密后的密码3.使用盐值+分隔符+加密后的密码生成数据库存储的密码
4.对比生成的最终密码和数据库最终的密码是否相等如果相等,那么用户名和密码就是对的,反之则是密码输入错误。 

package com.example.demo.common;import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;import java.nio.charset.StandardCharsets;
import java.util.UUID;public class PasswordUtils {//1.加盐生成密码public static String encrypt(String password){//盐32位String salt= UUID.randomUUID().toString().replace("-","");String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());String finalPassword=salt+"$"+saltPassword;return finalPassword;}//2.生成加盐密码public static String encrypt(String password,String salt){String saltPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes());String finalPassword=salt+"$"+saltPassword;return finalPassword;}/**验证密码** @param :用户输入的明文密码* @param :数据库保存的最终密码* @return*/public static boolean check(String inputPassword , String finalPassword){if(StringUtils.hasLength(inputPassword)&&StringUtils.hasLength(finalPassword)&&finalPassword.length()==65){String salt=finalPassword.split("\\$")[0];String confirmPssword=PasswordUtils.encrypt(inputPassword,salt);return confirmPssword.equals(finalPassword);}return false;}public static void main(String[] args) {String password="123456";String finalPassword=encrypt(password);System.out.println(PasswordUtils.encrypt(password));String inputPassword="12345";String inputPassword2="123456";System.out.println("比对结果1:"+ check(inputPassword,finalPassword));System.out.println("比对结果2  :"+ check(inputPassword2,finalPassword));//check(inputPassword2,finalPassword);}
}

 

 Spring Security

是提供身份验证和授权的框架 ,可用于用户认证,访问控制,安全事件和日志记录等

还有就是Spring Security加盐

      <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

 这样甚至改了页面

当用这个认证密码授权成功后才会到我们的登录页面

所以我们要排除SpringSecurity自动加载 

@SpringBootApplication(exclude = {SecurityAutoConfiguration.class})

package com.example.demo;import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;@SpringBootTest()
class  Demo1ApplicationTests {@Testvoid contextLoads() {BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();String password ="123456";// 第一次加密String finalPassword1 = passwordEncoder.encode(password);System.out.println("第1次加密:" + finalPassword1);// 第二次加密String finalPassword2 = passwordEncoder.encode(password);System.out.println("第2次加密:" + finalPassword2);// 第三次加密String finalPassword3 = passwordEncoder.encode(password);System.out.println("第3次加密:" + finalPassword3);// 验证密码String inputPassword = "12345";System.out.println("错误密码比对结果: " + (passwordEncoder.matches(inputPassword, finalPassword1)));String inputPassword2 = "123456";System.out.println("正确密码比对结果: " + (passwordEncoder.matches(inputPassword2, finalPassword1)));}}

 

java nio中一种基于MappedByteBuffer操作大文件

在Java中,处理大文件时常用的有基于`MappedByteBuffer`的NIO(New I/O)和基于`BufferedInputStream`、`BufferedOutputStream`等带缓冲的传统IO流。下面是它们之间的一些区别和相对优势:

1. 内存映射文件(MappedByteBuffer):
   - **优势**:
     - 避免了数据在Java堆内存和本地内存的多次拷贝,提高了IO操作的效率。
     - 可以利用操作系统的虚拟内存机制,对文件进行部分映射,实现了按需加载,对于大文件的处理性能更好。
     - 适合随机访问,可以直接在内存中修改文件内容,不需要通过读取和写入的方式。
   - **劣势**:
     - 需要谨慎管理内存映射,避免内存泄漏和资源未释放的问题。
     - 对于频繁读写的大文件,可能会导致内存占用过高。

2. 缓冲流(BufferedInputStream、BufferedOutputStream):
   - **优势**:
     - 通过缓冲区减少了对底层IO系统调用的次数,提高了IO操作效率。
     - 可以适应各种大小的文件读写,并且易于使用。
     - 适合顺序读写,对于较小的文件处理效率较高。
   - **劣势**:
     - 在处理大文件时,需要在Java和操作系统之间来回拷贝数据,可能会导致性能瓶颈。
     - 不支持直接在内存中修改文件内容,需要通过读取和写入的方式来进行操作。

综上所述,对于大文件的处理,基于`MappedByteBuffer`的NIO操作相对于传统的缓冲流操作具有更高的性能和更少的内存开销,特别是在需要随机访问大文件内容时,`MappedByteBuffer`更为适用。但需要注意合理管理内存映射,避免潜在的风险。而基于缓冲流的传统IO操作适用于各种大小的文件处理,易于使用,但在处理大文件时可能会存在性能瓶颈。

 

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

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

相关文章

UDS诊断 10服务

文章目录 简介诊断会话切换请求和响应1、请求2、子功能3、肯定响应4、否定响应5、特殊的NRC 为什么划分不同会话报文示例UDS中常用 NRC参考 简介 10服务&#xff0c;即 Diagnostic Session Control&#xff08;诊断会话控制&#xff09;服务用于启用服务器中的不同诊断会话&am…

(四) python门面模式

文章目录 4.1 结构型设计模式4.1.1 简介4.1.2 常见的几种结构型设计模式 4.2 理解门面设计模式4.2.1 门面设计模式概述4.2.2 门面设计模式的作用 4.3 UML类图4.3.1 门面4.3.2 系统4.3.3 客户端 4.4 门面模式的代码实现4.4.1 场景&#xff1a;4.4.2 python实现 4.5 原理&#xf…

渲染(iOS渲染过程解析)

渲染 渲染原理 一个硬核硬件科普视频 CPU和GPU CPU&#xff08;Central Processing Unit&#xff09;&#xff1a;现代计算机整个系统的运算核心、控制核心&#xff0c;适合串行计算。GPU&#xff08;Graphics Processing Unit&#xff09;&#xff1a;可进行绘图运算工作的…

安防音频接口选型的高性能国产芯片分析

在人工智能兴起之后&#xff0c;安防市场就成为了其全球最大的市场&#xff0c;也是成功落地的最主要场景之一。对于安防应用而言&#xff0c;智慧摄像头、智慧交通、智慧城市等概念的不断涌现&#xff0c;对于芯片产业催生出海量需求。今天&#xff0c;我将为大家梳理GLOBALCH…

Linux——缓冲区与实现C库的fopen,fwrite,fclose

目录 一.缓冲区 1缓冲区的概念 2.缓冲区存在的意义 3.缓冲区刷新策略 4.什么是刷新&#xff1f; C语言的缓冲区在哪里&#xff1f; ​编辑 仿写C库里的fopen&#xff0c;fclose&#xff0c;fwrite。 mystdio.h mystdio.c main.c(向文件中写入20次msg) 一.缓冲区 1…

b站pwn的学习总结

写的很乱 1.c语言的运行过程 了解了c语言需要经过以上2个过程&#xff08;编译和汇编&#xff09;&#xff0c;才能让机器按指令运行。机器只能听得懂机器码&#xff0c;所以要“汇编”。 那问题就来了&#xff0c;“编译”这个动作有啥用&#xff0c;c语言这种高级语言&…

玩转大数据10:深度学习与神经网络在大数据中的应用

目录 1. 引言&#xff1a;深度学习和神经网络在大数据中的重要性和应用场景 2. 深度学习的基本概念和架构 3. Java中的深度学习框架 3.1. Deeplearning4j框架介绍及Java编程模型 3.2. DL4J、Keras和TensorFlow的集成 4. 大数据与深度学习的结合 4.1. 大数据与深度学…

电脑端同时登录多个微信

1、建立一个txt文件 2、右击微信查看应用的属性&#xff0c;记录文件的位置 3、将步骤二得到的路径按照下方的格式输入到步骤一的文本中 4、保存之后将文本后缀名的.txt改成.bat 5、在未登录微信的情况下&#xff0c;双击即可得到两个微信登录窗口

解决idea 通过build project 手动触发热部署失败

在debug运行项目的过程中&#xff0c;并且保证&#xff08;不添加方法&#xff0c;不修改方法名&#xff09;一定的规则的情况下&#xff0c;可以通过build project 来手动热部署项目&#xff0c;也就是会交换class文件与resouces文件。 设置项 Edit Configurations Modify Op…

计算机图形学理论(1):建模基础

本系列根据国外一个图形小哥的讲解为本&#xff0c;整合互联网的一些资料&#xff0c;结合自己的一些理解。 场景的组成部分 场景相当于一个或多个模型的集合。模型包含以下内容&#xff1a; 结构描述&#xff1a;几何形状&#xff0c;如顶点、纹理坐标等表面描述&#xff1a…

Vue3中的defineModel

目录 一、vue3的defineModel介绍 二、defineModel使用 &#xff08;1&#xff09;在vite.config.js中开启 &#xff08;2&#xff09;子组件 &#xff08;3&#xff09;父组件 一、vue3的defineModel介绍 为什么要使用到defineModel呢&#xff1f;这里有这样一种场景&…

“快速排序:一种美丽的算法混沌”(1.hoare)

欢迎来到我的博客&#xff01;在今天的文章中&#xff0c;我将采用一种独特且直观的方式来探讨我们的主题&#xff1a;我会使用一幅图像来贯穿整篇文章的讲解。这幅精心设计的图表不仅是我们讨论的核心&#xff0c;也是一个视觉辅助工具&#xff0c;帮助你更深入地理解和掌握本…

学习深度强化学习---第2部分----RL动态规划相关算法

文章目录 2.1节 动态规划简介2.2节 值函数与贝尔曼方程2.3节 策略评估2.4节 策略改进2.5节 最优值函数与最优策略2.6节 值迭代与策略迭代2.7节 动态规划求解最优策略 本部分视频所在地址&#xff1a;深度强化学习的理论与实践 2.1节 动态规划简介 态规划有两种思路&#xff1…

前端 Web Workers 简介

简介 以前我们总说&#xff0c;JS 是单线程没有多线程&#xff0c;当 JS 在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验&#xff0c;从而需要设置把任务放在任务队列中&#xff1b;执行任务队列中的任务也并非多线程进行的&#xff0c;然而现在 HTML5 提供了…

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值 Bundle ID这个就不说了&#xff0c;都知道是啥&#xff0c;主要说公钥信息和SHA-1值的获取 打开钥匙串访问&#xff0c;找到当前需要备案App的dis证书&#xff0c;如下&#xff1a; #####右键点击显示简介 #####可以看…

03.仿简道云公式函数实战-QLExpress初探

1. 前言 在上一篇文章中&#xff0c;我们简单介绍了一下表达式引擎&#xff0c;并引出我们的主角QLExpress.在这篇文章中&#xff0c;我们先来一个QLExpress的热身。 2. 初探QLExpress 源码地址&#xff1a;https://github.com/alibaba/qlExpress 笔者下载源码的版本是3.3.…

STL源码剖析笔记——适配器(adapters)

系列文章目录 STL源码剖析笔记——迭代器 STL源码剖析笔记——vector STL源码剖析笔记——list STL源码剖析笔记——deque、stack&#xff0c;queue STL源码剖析笔记——Binary Heap、priority_queue STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap STL源…

【Spring 基础】00 入门指南

【Spring 基础】00 入门指南 文章目录 【Spring 基础】00 入门指南1.简介2.概念1&#xff09;控制反转&#xff08;IoC&#xff09;2&#xff09;依赖注入&#xff08;DI&#xff09; 3.核心模块1&#xff09;Spring Core2&#xff09;Spring AOP3&#xff09;Spring MVC4&…

php实现截取姓名中的第一个字作为头像的实战记录

php 截取中文字符串第一个字 substr 函数 在 PHP 中&#xff0c;使用 substr 函数来截取中文字符串的第一个字。由于 PHP 默认的字符编码是 UTF-8&#xff0c;它可以正确处理中文字符。 $chineseString "你好世界"; $firstChar substr($chineseString, 0, 1); e…

中文分词演进(查词典,hmm标注,无监督统计)新词发现

查词典和字标注 目前中文分词主要有两种思路&#xff1a;查词典和字标注。 首先&#xff0c;查词典的方法有&#xff1a;机械的最大匹配法、最少词数法&#xff0c;以及基于有向无环图的最大概率组合&#xff0c;还有基于语言模型的最大概率组合&#xff0c;等等。 查词典的方法…