上海行业门户网站建设工具,广州十大纯设计公司,网络推广员的前景,西安自动seo目录 引言加密/加盐加密的必要性密码算法分类1. 对称加密算法2. 非对称加密算法3. 摘要算法 加密思路MD5可加密原理#xff1a;加盐 运用加密/加盐写加密/解密⼯具类运用实战 引言
在 Java Spring 后端开发中#xff0c;“安全” 永远是绕不开的话题#xff0c;用户登录如何…目录引言加密/加盐加密的必要性密码算法分类1. 对称加密算法2. 非对称加密算法3. 摘要算法加密思路MD5可加密原理加盐运用加密/加盐写加密/解密⼯具类运用实战引言在 Java Spring 后端开发中“安全”永远是绕不开的话题用户登录如何免 Session 认证用户密码如何防止泄露我们通过上篇令牌技术下篇加盐/加密这两个核心技术,来聊聊关于如何让后端的认证体系更安全、更可靠加密/加盐加密的必要性在 MySQL 数据库的日常使用过程中用户密码、身份证号码、手机号码这类敏感数据的加密处理至关重要这是保障数据安全的核心环节倘若直接以明文形式存储这些信息一旦数据库遭遇黑客攻击并被非法侵入攻击者就能轻易窃取到用户的各类敏感信息。这种情况的发生不仅会导致用户个人信息泄露还可能给用户自身或所属企业带来财产方面的损失造成难以估量的后果密码算法分类密码算法主要分为三类:对称密码算法,⾮对称密码算法,摘要算法1. 对称加密算法核心特性加密、解密使用同一密钥运算速度快、效率高。子类型分组密码算法将数据分割为固定长度的块进行加密如 AES、DES。流密码算法逐字节生成密钥流与明文逐位加密如 ChaCha。适用场景大数据量加密如文件、数据库字段需注意密钥安全管理。2. 非对称加密算法核心特性使用公钥 私钥的密钥对公钥可公开、私钥需保密公钥加密的数据仅能通过对应私钥解密反之亦然。优势解决了对称加密的 “密钥分发” 问题支持数字签名私钥签名、公钥验证。不足加解密速度远慢于对称加密。适用场景小数据加密如密钥交换、数字签名典型算法如 RSA、ECC。3. 摘要算法核心特性单向哈希运算将任意长度数据转换为固定长度的 “摘要值”无法从摘要反推原文数据微小变化会导致摘要完全不同。子类型MDMessage Digest消息摘要算法如 MD5。SHA-1Secure Hash Algorithm安全散列算法。MACMessage Authentication Code消息认证码算法。适用场景数据完整性验证、密码存储存摘要而非明文、数字签名组件。加密思路本篇文字主要以MD5算法来讲解加密MD5可加密原理加盐MD5本身是不可逆的加上相同的密码经过MD5哈希之后的密⽂是相同的就很有可能被破解但是我们可以采⽤为⼀个密码拼接⼀个随机字符来进⾏加密这个随机字符我们称之为“盐”这样子即使黑客拿到数据库的数据也是加密后字符串和盐的组合的字符串密⽂相同,盐值相同,则证明 明⽂相同运用加密/加盐写加密/解密⼯具类publicclassSecurityUtil{//加密//返回盐值md5(盐值明文)publicstaticStringencrypt(Stringpassword){StringsaltUUID.randomUUID().toString().replace(-,);StringsecurityPasswordDigestUtils.md5DigestAsHex((saltpassword).getBytes(StandardCharsets.UTF_8));returnsaltsecurityPassword;}//解密publicstaticbooleanverify(StringinputPassword,StringsqlPassword){if(!StringUtils.hasLength(inputPassword)){returnfalse;}if(sqlPasswordnull||sqlPassword.length()!64){returnfalse;}StringsaltsqlPassword.substring(0,32);StringsecurityPasswordDigestUtils.md5DigestAsHex((saltinputPassword).getBytes(StandardCharsets.UTF_8));returnsqlPassword.equals(saltsecurityPassword);}}工具解析使用加密/解密⼯具类简单测试publicstaticvoidmain(String[]args){Stringencryptencrypt(123456);booleanverifyverify(123456,encrypt);System.out.println(verify);}测试结果运用实战创建响应和请求实体类DatapublicclassUserLoginRequest{NotNull(message用户名不能为空)privateStringuserName;NotNull(message密码不能为空)privateStringpassword;}DataAllArgsConstructorpublicclassUserLoginResponse{privateIntegeruserId;privateStringtoken;}UserLoginResponse 接口类RequestMapping(/login)publicUserLoginResponselogin(RequestBodyValidatedUserLoginRequestuserLoginRequest){log.info(用户登录,用户名:{},userLoginRequest.getUserName());returnuserService.checkPassword(userLoginRequest);}UserServiceImpl Serviece类ServicepublicclassUserServiceImplimplementsUserService{AutowiredprivateUserInfoMapperuserInfoMapper;Resource(nameblogServiceImpl)privateBlogServiceblogService;OverridepublicUserLoginResponsecheckPassword(UserLoginRequestuserLoginRequest){QueryWrapperUserInfoqueryWrappernewQueryWrapper();queryWrapper.lambda().eq(UserInfo::getUserName,userLoginRequest.getUserName()).eq(UserInfo::getDeleteFlag,0);UserInfouserInfouserInfoMapper.selectOne(queryWrapper);if(userInfonull){//用户不存在thrownewBlogException(用户不存在);}//判断密码是否一致if(!SecurityUtil.verify(userLoginRequest.getPassword(),userInfo.getPassword())){thrownewBlogException(用户密码错误);}//密码正确MapString,ObjectmapnewHashMap();map.put(id,userInfo.getId());map.put(name,userInfo.getUserName());StringtokenJwtUtils.genToken(map);returnnewUserLoginResponse(userInfo.getId(),token);}使⽤测试类给密码123456⽣成密⽂写到数据库测试当密码输入123456时可以登录当输入不为123456时提示密码输入错误加密成功