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

news2024/11/26 14:42:28

自己实现 

传统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 {

    @Test
    void 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.coloradmin.cn/o/1301042.html

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

相关文章

生产问题: 利用线程Thread预加载数据缓存,其它类全局变量获取缓存偶发加载不到

生产问题: 利用线程Thread预加载数据缓存偶发加载不到 先上代码 public class ThreadTest {//本地缓存Map<String, Object> map new HashMap<String, Object>();class ThreadA implements Runnable{Overridepublic void run() {System.out.println("Thread…

【崩坏:星穹铁道】卡芙卡狂喜!1.5版本新遗器值不值得刷?

《崩坏&#xff1a;星穹铁道》在1.5版本上线了4套新的遗器套装&#xff0c;照例还是两套外圈遗器两套内圈遗器&#xff0c;分别可以通过幽冥之径侵蚀隧洞副本和模拟宇宙第八世界刷取。 那么本期闲游盒小盒子就简单解析一下这4套新遗器&#xff0c;它们的属性适合哪些角色&#…

2021版吴恩达深度学习课程Deeplearning.ai 05序列模型 12.5

学习内容 05.序列模型 1.1 为什么用序列模型 1.序列模型常见的应用 1.2 注释 notation 1.*T_x(i)表示训练样本x(i)的序列长度&#xff0c;T_y(i)表示target(i)的序列长度2.训练集表示单词的方式*构建字典的方式*在训练集中查找出现频率最高的单词*网络搜集常用字典3.如果遇…

微服务——服务保护Sentinel

雪崩问题 在单体项目里面&#xff0c;如果某一个模块出问题会导致整个项目都有问题。 在微服务项目里面&#xff0c;单独一个服务出问题理论上是不会影响别的服务的。 但是如果有别的业务需要调用这一个模块的话还是会有问题。 问题产生原因和解决思路 最初那只是一个小小…

GEE影像升尺度(10m->250m)

GEE影像升尺度&#xff08;10m->250m&#xff09; 代码 var ext /* color: #d63000 *//* shown: false *//* displayProperties: [{"type": "rectangle"}] */ee.Geometry.Polygon([[[108.74625980473367, 28.562445155322063],[108.74625980473367, …

云计算在计算机领域的应用与发展

云计算在计算机领域的应用与发展 一、引言 随着科技的不断发展&#xff0c;计算机领域已经成为当今社会最为活跃和创新的领域之一。云计算作为一种新兴的计算模式&#xff0c;已经在计算机领域中得到了广泛的应用&#xff0c;并且正在不断地推动着计算机领域的发展。本文将探…

令牌桶算法理解学习(限流算法)

令牌桶算法是网络流量整形&#xff08;Traffic Shaping&#xff09;和速率限制&#xff08;Rate Limiting&#xff09;中最常使用的一种算法。典型情况下&#xff0c;令牌桶算法用来控制发送到网络上的数据的数目&#xff0c;并允许突发数据的发送。 用简单的话语来说就是限制…

基于MyBatis二级缓存深入装饰器模式

视频地址 学习文档 文章目录 一、示意代码二、装饰器三、经典案例—MyBatis二级缓存1、Cache 标准定义2、PerpetualCache 基础实现3、增强实现3-1、ScheduledCache3-2、LruCache 先来说说我对装饰器理解&#xff1a;当你有一个基础功能的代码&#xff0c;但你想在不改变原来代…

轻量封装WebGPU渲染系统示例<46>- 材质组装管线(MaterialPipeline)灯光、阴影、雾以及多Pass(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/MaterialPipelineMultiPasses.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下&#xff1a; export class MaterialPipelin…

airserver mac 7.27官方破解版2024最新安装激活图文教程

airserver mac 7.27官方破解版是一款好用的airplay投屏工具&#xff0c;可以轻松将ios荧幕镜像&#xff08;airplay&#xff09;至mac上&#xff0c;在mac平台上实现视频、音频、幻灯片等文件资源的接收及投放演示操作&#xff0c;解决iphone或ipad的屏幕录像问题&#xff0c;满…

Leetcode1466. 重新规划路线

Every day a Leetcode 题目来源&#xff1a;1466. 重新规划路线 解法1&#xff1a;深度优先搜索 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。 因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗…

实战1-python爬取安全客新闻

一般步骤&#xff1a;确定网站--搭建关系--发送请求--接受响应--筛选数据--保存本地 1.拿到网站首先要查看我们要爬取的目录是否被允许 一般网站都会议/robots.txt目录&#xff0c;告诉你哪些地址可爬&#xff0c;哪些不可爬&#xff0c;以安全客为例子 2. 首先测试在不登录的…

高项备考葵花宝典-项目进度管理核心概念加强记忆

项目进度管理的核心目标是使项目按时完成。 目录 一、待办事项列表 二、看板方法 三、在制品 四、进度计划模型 五、活动清单 六、里程碑清单 七、前导图法 八、资源日历 九、活动历时估算方法 一、待办事项列表 如上图所示&#xff0c;实际工作中需求往往不是一次性全…

【Linux】find . -perm 644 -exec ls -l {} \;

find . -perm 644 -exec ls -l {} ; find 命令使用 -perm 644 条件来查找文件权限为644的文件&#xff0c;然后通过 -exec ls -l {} \; 将这些文件传递给 ls -l 命令来显示详细的文件列表。 find . -perm 644&#xff1a;在当前目录及其子目录中查找文件权限为644的文件。 -e…

力扣每日一题day33[111. 二叉树的最小深度]

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2示例 2&#xff1a; 输入…

【小白专用】php执行sql脚本 更新23.12.10

可以使用 PHP 的 mysqli 扩展来执行 SQL 脚本。具体步骤如下&#xff1a; 连接到数据库&#xff1b;打开 SQL 脚本文件并读取其中的 SQL 语句&#xff1b;逐条执行 SQL 语句&#xff1b;关闭 SQL 脚本文件&#xff1b;关闭数据库连接。 以下是通过 mysqli 执行 SQL 脚本的示例…

python 画条形图(柱状图)

目录 前言 基础介绍 月度开支的条形图 前言 条形图&#xff08;bar chart&#xff09;&#xff0c;也称为柱状图&#xff0c;是一种以长方形的长度为变量的统计图表&#xff0c;长方形的长度与它所对应的变量数值呈一定比例。 当使用 Python 画条形图时&#xff0c;通常会使…

STM32 标准外设SPL库、硬件抽象层HAL库、低层LL库区别?

1、STM32 之一 HAL库、标准外设库、LL库_ZCShou的博客-CSDN博客_ll库&#xff08;仔细阅读&#xff09; 2、STM32标准外设库、 HAL库、LL库 - King先生 - 博客园 3、STM32 之 HAL库_戈 扬的博客&#xff08;仔细阅读&#xff09; 4、STM32 LL 为什么比 HAL 高效&#xff1…

通信:mqtt学习网址

看这个网址&#xff1a;讲的很详细&#xff0c;后面补实战例子 第一章 - MQTT介绍 MQTT协议中文版 (gitbooks.io)https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/01-Introduction.html

【Matlab算法】多维函数求解的基本概念

多维函数求解的基本概念 多维函数最优化问题最优化算法最优化问题的类型最优化算法的分类常用的多维函数求解方法结语 多维函数 多维函数是指定义在 R n \mathbb{R}^n Rn 上的函数&#xff0c;其中 n n n 是函数的维数。例如&#xff0c; f ( x , y ) x 2 y 2 f(x, y) x^…