首页 > 其他分享 >电子公文传输系统安全-进展2

电子公文传输系统安全-进展2

时间:2024-05-26 18:55:37浏览次数:9  
标签:公文 return String 传输 import password com example 系统安全

- 上周任务完成情况
完成对于登陆过程中的加盐操作:

 SM3加盐算法存储密码的实现类
 加盐思路: 1.通过UUID拿到盐值 2.拼接:盐值+明文密码 3.对2中数据进行SM3哈希 4.拼接: 盐值 + ”^“ + 3中的哈希值
 明文密码走完上述流程后后存入数据库
 登录验证: 1.根据用户名在数据库里得到对应的密文 2.根据密文密码获取该用户的盐值 3.将用户输入的登录密码走完上述加盐思路 4.与数据库密文密码进行对比

相关代码:

 

Sm3SaltUtil.java

 

 

package com.example.demo.util;

import org.springframework.util.StringUtils;

import java.util.UUID;
import org.bouncycastle.crypto.digests.SM3Digest;

public class Sm3SaltUtil {
    /**
     * 用户注册
     * 调用该方法进行SM3加盐处理后存入数据库
     * @param password
     * @return
     */
    public static String encrypt(String password) {
        // 1.生成盐值
        String salt = UUID.randomUUID().toString().replace("-","");

        // 2.生成加盐后的SM3哈希值
        String saltPassword = sm3Hash(salt + password);

        // 3.生成最终存入数据库的加密密码   65位固定规则
        String finalPassword = salt + "^" + saltPassword;
        return finalPassword;
    }

    /**
     * 用户登录的工具方法
     * 该方法是对用户输入的密码进行上述加盐操作后与数据库密文密码进行比较的工具方法
     * @param password
     * @param salt
     * @return
     */
    public static String encrypt(String password, String salt) {
        // 1.得到加盐之后的SM3哈希值
        String saltPassword = sm3Hash(salt + password);

        // 2.生成最终密码
        String finalPassword = salt + "^" + saltPassword;

        return finalPassword;
    }

    /**
     * 用户登录密码正确性验证
     * @param password           用户登录时输入的密码
     * @param dbFinalPassword    用户数据库里最终的加密密码
     * @return
     */
    public static boolean check(String password, String dbFinalPassword) {
        if (StringUtils.hasLength(password)
                && StringUtils.hasLength(dbFinalPassword)
                && dbFinalPassword.length() == 97) {
            String salt = dbFinalPassword.split("\\^")[0];
            String confirmFinalPassword = encrypt(password, salt);

            if (dbFinalPassword.equals(confirmFinalPassword)) {
                return true;
            }
        }

        return false;
    }

    /**
     * 使用SM3算法进行哈希计算
     * @param input 输入字符串
     * @return 哈希结果的十六进制表示
     */
    private static String sm3Hash(String input) {
        SM3Digest digest = new SM3Digest();
        byte[] data = input.getBytes();
        digest.update(data, 0, data.length);
        byte[] hash = new byte[digest.getDigestSize()];
        digest.doFinal(hash, 0);
        return bytesToHex(hash);
    }

    /**
     * 将字节数组转换为十六进制字符串表示
     * @param bytes 字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                sb.append('0');
            }
            sb.append(hex);
        }
        return sb.toString();
    }
}

 

login:

package com.example.demo.controller;

import com.example.demo.component.GeneratorId;
import com.example.demo.component.TokenUtil;
import com.example.demo.enums.Code;
import com.example.demo.enums.Keys;
import com.example.demo.pojo.entity.UserInfo;
import com.example.demo.service.UserInfoService;
import com.example.demo.util.Sm3SaltUtil;
import com.example.demo.util.Return;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@Controller
@ResponseBody
@RequestMapping("/public/user")
public class UserInfoController {

    @Autowired
    private UserInfoService userInfoService;

    @Autowired
    private TokenUtil tokenUtil;

    @Autowired
    private GeneratorId generatorId;

    @GetMapping("/login")
    public Return userLogin(UserInfo user, HttpServletRequest request) {
        if (user == null
                || !StringUtils.hasLength(user.getAccount())
                || !StringUtils.hasLength(user.getPassword())) {
            // 非法参数
            return Return.fail(Code.FAIL_NORMAL);
        }

        // 处理登录请求:查询数据库密码通过Sm3封装的方法进行对比
        // 1.查询数据库
        UserInfo dbUser = userInfoService.login(user);
        if (dbUser == null || dbUser.getId() <= 0) {
            return Return.fail(Code.FAIL_LOGIN);
        }

        // 2.调用Sm3工具类方法进行对比
        if (!Sm3SaltUtil.check(user.getPassword(),dbUser.getPassword())) {
            // 密码不一样,登录失败
            return Return.fail(Code.FAIL_LOGIN);
        }

        // 3.登录成功,可存入redis key-token:生成的随机唯一值  value:user
        String ip = request.getRemoteAddr();
        dbUser.setPassword("******");
        dbUser.setIp(ip);
        //TokenUtil.setObjectInSession(ApplicationVariable.USER_SESSION_KRY,dbUser,request);

        // 3.redis实现token
        // 3.1 生成随机token
        String token = UUID.randomUUID().toString().replace("-","");
        // 3.2 保存到redis
        tokenUtil.setUserInfo(token,dbUser,30L, TimeUnit.MINUTES);

        // 5.返回登录成功 返回token  后续携带token
        return Return.success(Code.SUCCESS_NORMAL,token);
    }

    @PostMapping("/enroll")
    public Return enroll(UserInfo user, HttpServletRequest request) {
        // 非法校验
        if (user == null
                || !StringUtils.hasLength(user.getAccount())
                || !StringUtils.hasLength(user.getPassword())) {
            return Return.fail(Code.FAIL_NORMAL);
        }

        // 调用Sm3工具类进行密码加密
        String password = user.getPassword();
        password = Sm3SaltUtil.encrypt(password);
        user.setPassword(password);

        // 获取ip
        String ip = request.getRemoteAddr();
        user.setIp(ip);

        // 生成id
        user.setId(generatorId.nextId(Keys.USER_ID.getKey()));

        // 注册
        int result = userInfoService.enroll(user);
        if (result != 1) {
            // 注册失败
            return Return.fail(Code.FAIL_NORMAL);
        }

        // 返回
        return Return.success(Code.SUCCESS_NORMAL);
    }

    @GetMapping("/logout")
    public Return logout(@RequestHeader("token")String token) {
        // 删除token
        tokenUtil.removeUserInfo(Keys.USER_TOKEN + token);
        return Return.success(Code.SUCCESS_NORMAL);
    }

    @RequestMapping("/list")
    public Return list(@RequestHeader("token") String token) {
        // 1. 查看权限
        UserInfo user = tokenUtil.getUserInfo(token);
        if (user == null || user.getId() == 1) {
            return Return.fail(Code.NOT_SEE);
        }
        // 2. 返回
        return Return.success(Code.SUCCESS_NORMAL, userInfoService.list());
    }

    @RequestMapping("/count")
    public Return count() {
        return Return.success(Code.SUCCESS_NORMAL,userInfoService.count());
    }

    @GetMapping("/info")
    public Return info(@RequestHeader("token")String token) {
        if (token == null) {
            return Return.fail(Code.FAIL_NORMAL);
        }

        UserInfo userInfo = tokenUtil.getUserInfo(token);
        if (userInfo == null) {
            return Return.fail(Code.FAIL_NORMAL);
        }
        UserInfo userInfoVo = new UserInfo();
        userInfoVo.setAccount(userInfo.getAccount());
        userInfoVo.setStatus(userInfo.getStatus());
        return Return.success(Code.SUCCESS_NORMAL,userInfoVo);
    }
}

  

实验预期:

 

 

- 本周计划

完成审计的相关设计

实验代码:

 

 

 

实验预期:

 

标签:公文,return,String,传输,import,password,com,example,系统安全
From: https://www.cnblogs.com/mpse/p/18214115

相关文章

  • 电子公文传输系统-进展二
    上周任务完成情况改进密码存储方案,解决用户密码存储未加密问题重新商讨密钥存储方案,解决用户公私钥对存在未加密问题修改css文件,美化前端页面完善后端数据库功能实现修改SM3哈希算法和加盐技术来存储密码sm3_hash_with_salt函数defsm3_hash_with_salt(password,salt):......
  • 《计算机网络微课堂》2-2 物理层下面的传输媒体
    请大家注意,传输媒体不属于计算机网络体系结构的任何一层,如果非要将它添加到体系结构中,‍‍那只能将其放在物理层之下。传输媒体可分为两类:一类是导引型传输媒体,‍‍另一类是非导引型传输媒体。在导引型传输媒体中,电磁波被导引沿着固体媒体传播,‍‍常见的导引型传输媒体有同轴电......
  • 《计算机网络微课堂》2-3 传输方式
    本节课我们介绍几种传输方式:串行传输和并行传输同步传输和异步传输单工,半双工‍‍以及全双工通信​​串行我们首先来看串行传输和并行传输,串行传输是指‍‍数据是一个比特依次发送的,因此在发送端和接收端之间‍‍只需要一条数据传输线路即可。‍并行传输是指‍‍一次发送......
  • 实验二 电子公文传输系统安全-进展2
    实验二电子公文传输系统安全-进展2上周任务完成情况(代码链接,所写文档等)本周计划上周任务完成情况使用国密算法SM2,在注册账号时为用户生成公私钥对try{//设置SM2曲线参数ECGenParameterSpececGenSpec=newECGenParameterSpec("sm2p256v1");KeyPair......
  • 实验二 电子传输系统安全-进展2
    实验二电子传输系统安全-进展2上周任务学习gmssl相关知识学习加密相关知识,选择合适的国密算法部署安装gmssl中的算法库将相关算法库接口利用maven导入系统进行调用调试运行更改加密算法后的系统·学习密码项目标准进行系统优化上周任务完成情况学号姓名任务完成......
  • IceRPC之多路复用传输>快乐的RPC
    作者引言很高兴啊,我们来到了IceRPC之多路复用传输>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界。icerpc和多路复用传输了解icerpc协议和多路复用传输icerpc协议当创建到服务器地址icerpc://hello.zeroc.com的客户端连接时,指示IceRPC建立使用ic......
  • 实验二 电子传输系统安全-进展2
    任务详情上周任务完成情况(代码链接,所写文档等)本周计划上周任务完成情况采用sm4对存储的公文进行加密处理,密钥随机生成,乱序存储在数据库中。其中sm4采用cbc模式,iv固定,跟随密文一起存储。解密的时候读取密文并分离密文和iv,然后解密。SM3加盐存储代码packagecn.edu.nuc.a......
  • 探索SPI单线传输模式:时钟线与数据传输的简化之道
    探索SPI单线传输模式:时钟线与数据传输的简化之道在当今的嵌入式系统和微控制器通信中,串行外设接口(SPI)因其高速、全双工和同步的特点而广受欢迎。然而,随着设备尺寸和复杂性的不断减少,对SPI通信的简化需求也日益增加。在这种背景下,SPI的单线传输模式成为了一个备受关注的解决方案。......
  • 实验二 电子公文传输系统安全-进展2
    实验二电子公文传输系统安全-进展2任务详情上周任务完成情况(代码链接,所写文档等)本周计划上周任务完成情况SM3加盐packagecn.edu.nuc.article.util;importorg.bouncycastle.crypto.digests.SM3Digest;importorg.bouncycastle.jce.provider.BouncyCastleProvider;......
  • Bash反弹shell & 搭建网页服务器 & 文件描述符学习 & ssh连接vm虚拟机 & sftp进行文件
    环境:kali:┌──(kali㉿kali)-[~/Desktop]└─$cat/proc/versionLinuxversion6.0.0-kali5-amd64([email protected])(gcc-12(Debian12.2.0-9)12.2.0,GNUld(GNUBinutilsforDebian)1.建立一个简单的链接进行nc,可以进行两个端口通信!#首先使用nc监听......