Vue3问题:如何实现密码加密登录?前后端!

news2024/12/24 9:35:48

前端功能问题系列文章,点击上方合集↑

序言

大家好,我是大澈!

本文约3400+字,整篇阅读大约需要6分钟。

本文主要内容分三部分,第一部分是需求分析,第二部分是实现步骤,第三部分是问题详解。

如果您只需要解决问题,请阅读第一、二部分即可。

如果您有更多时间,进一步学习问题相关知识点,请阅读至第三部分。

1. 需求分析

在前端,用户点击登录和注册时,在登录和注册接口中不允许看到请求中真正的用户密码。

在后端,用户点击登录和注册时,在数据库中不允许存取真正的用户密码。

图片

图片

2. 实现步骤

2.1 实现前的说明

在学习如何使用之前,我们要明白的是,在项目中如果进行密码加密,有哪几种情况。然后就是,实现密码加密的方式有哪些,哪一种是相较来说,较好用及安全性较高的。

密码加密实现情况

  • 前端进行密码加密,后端也进行密码加密

  • 前端进行密码加密,后端不进行密码加密

  • 前端不进行密码加密,后端进行密码加密 

已上这三种情况,在实际的开发中,使用较多的,当然是第一种情况,这种情况可以提供更高的安全性和密码保护。

前端将用户密码进行加密后再传输给后端,可以减少密码在网络传输过程中的风险,确保密码的机密性。

后端再对接收到的密码进行加密,将加密后的密码存储到数据库中。这样即使数据库遭到非法访问,密码也不会以明文形式暴露,增加了密码的安全性。

这一点说明到这里打住,不再赘述。

然后就是实现密码加密的常用方式

  • 对称加密算法:AES、DES、3DES

  • 非对称加密算法:RSA

  • 哈希函数:MD5、SHA-1、SHA-256、SHA-512

  • 密码推导函数:BCrypt、PBKDF2、SCrypt

对称加密算法使用相同密钥进行加密和解密,非对称加密算法使用公钥和私钥,哈希函数将数据转换为固定长度的哈希值,密码推导函数通过迭代和加盐增加密码破解难度。

上述加密方式,从上往下,安全性依次增高

这一点在这里只做简要说明,有需要的朋友,请见第三部分对加密方式的详细总结。

搞清楚这些,然后下面,就是如何使用的问题了。

为提高大家的使用效率,这里大澈只提供较常用的情况(第一种),以及较安全的密码加密方式(BCrypt)的使用。

其它加密方式的使用,与此大同小异。

2.2 编写前端代码

模板代码:

<template>
  <div>
    <input type="text" v-model="username" placeholder="Username" />
    <input type="password" v-model="password" placeholder="Password" />
    <button @click="register">Register</button>
    <button @click="login">Login</button>
  </div>
</template

引入依赖:

npm i bcryptjs

图片

逻辑代码:

<script setup>
  // 使用 bcrypt.js 进行密码加密
  import bcrypt from 'bcryptjs'; 

  const password = ref('')
  // 设置与后端相同的 cost 盐值
  const cost = 10; 

  const register = async () => {
      // 前端加密密码
      const hashedPassword = await bcrypt.hash(password.value, cost); 

      // 将用户名和加密后的密码发送到后端进行注册
      // ...
    },

  const login = async () => {
    // 前端加密密码
    const hashedPassword = await bcrypt.hash(password.value, cost); 

    // 将用户名和加密后的密码发送到后端进行登录验证
    // ...
  }
</script>

2.3 编写后端接口(了解即可)

这里做一下说明:

  • 为方便举例,cost盐值这里使用了固定值,但在项目中一般都会使用随机字符串作为盐值。前端生成盐值,在登录和注册时会和加密的密码一同传递给后端,后端接收后,会使用对应盐值对密码做二次加密,以及将盐值存到数据库中。

  • 为方面举例,后端接口的编写全部都写在了Controller层,还有一些其他必要的鉴权验证也都省略了。

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@RestController
public class UserController {

    // 设置与前端相同的 cost 盐值
    private static final int COST = 10; 

    @Autowired
    private PasswordEncoder passwordEncoder;

    // 注册接口
    @PostMapping("/register")
    public ResponseEntity<?> registerUser(@RequestBody UserRequest userRequest) {
        String username = userRequest.getUsername();
        String password = userRequest.getPassword(); // 前端已经进行了密码加密

        // 后端对密码进行加密
        String encryptedPassword = passwordEncoder.encode(password);
        // 存储用户信息及加密后的密码、对应盐值到数据库
        // ...

        return ResponseEntity.ok("User registered successfully!");
    }

    // 登录接口
    @PostMapping("/login")
    public ResponseEntity<?> loginUser(@RequestBody UserRequest userRequest) {
        String username = userRequest.getUsername();
        String password = userRequest.getPassword(); // 前端已经进行了密码加密

        // 从数据库中根据用户名查询用户信息
        User user = userRepository.findByUsername(username);

        if (user == null) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password");
        }

        // 后端验证密码
        boolean isMatched = passwordEncoder.matches(password, user.getPassword());
        
        // 认证成功,生成 JWT Token 等操作
        // ...

        if (isMatched) {
            return ResponseEntity.ok("Login successful!");
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid username or password");
        }
    }
}

3. 问题详解

3.1 关于加密方式的详细总结

图片

AES

  • AES是一种对称加密算法,用于保护敏感数据的机密性。

  • 它使用相同的密钥进行加密和解密,密钥长度可以是128位、192位或256位。

  • AES是一种高度安全和高效的加密算法,广泛应用于数据保护和传输领域。

RSA

  • RSA是一种非对称加密算法,用于加密通信、数字签名等安全功能。

  • RSA使用一对密钥,包括公钥和私钥。

  • 公钥用于加密数据,私钥用于解密数据或生成数字签名。

  • RSA算法基于大数的因数分解问题,被认为是一种安全可靠的加密算法。

MD5

  • MD5是一种哈希函数,将输入数据转换为固定长度的128位哈希值。

  • MD5是不可逆的,即无法从哈希值还原出原始数据。

  • MD5常用于校验数据完整性,但由于存在碰撞攻击漏洞,不适合用于密码加密。

SHA

  • SHA是一系列哈希函数,包括SHA-1、SHA-256、SHA-512等。

  • SHA将输入数据转换为固定长度的哈希值,用于校验数据完整性和密码存储等领域。

  • SHA-1已经不再被推荐使用,而SHA-256和SHA-512仍然被广泛应用。

BCrypt

  • BCrypt是一种密码推导函数,用于存储密码并提供较高的安全性。

  • 它通过迭代和加盐的方式增加密码破解的难度。

  • BCrypt使用的盐值是随机生成的,并且每个密码都使用独特的盐值进行加密。

PBKDF2

  • PBKDF2是一种密码推导函数,通过迭代和加盐从密码中派生出密钥。

  • 它提供更高的密码破解难度,适用于密码存储和验证场景。

  • PBKDF2的迭代次数和盐值都可以调整,以增加计算成本和提高安全性。

SCrypt

  • SCrypt是一种密码推导函数,专门设计来抵御特定硬件攻击。

  • 它通过调整参数和内存需求增加计算成本,提高密码破解的难度。

  • SCrypt在密码存储和验证方面提供更高的安全性,但相对于其他函数可能需要更多的计算资源。

    秃头时刻!!!

3.2 密码学中的不可逆是啥

很枯燥的一段学术语言,大家随便看看即可,哈哈哈。

这里也是为什么使用MD5加密时,常常会进行加盐处理的原因了。

图片

在密码学中,不可逆(irreversible)表示无法从哈希值还原出原始数据。

当数据经过哈希函数处理后,生成的哈希值是固定长度的一串字符。不可逆意味着无法通过逆向计算或解密操作来获取原始数据。即使输入数据的细微改变也会导致生成完全不同的哈希值。

这种不可逆性是哈希函数的重要特性之一,用于保证数据的完整性和验证数据的一致性。通过对原始数据进行哈希处理,并将哈希值与预期的哈希值进行比对,可以快速检查数据是否被篡改或损坏。如果哈希值相同,则可以确定数据完整性没有受到破坏;如果哈希值不同,则说明数据已被修改,或者数据传输过程中出现了错误。

需要注意的是,虽然哈希函数是不可逆的,但是存在哈希碰撞的概率,即不同的输入数据可能会产生相同的哈希值。然而,好的哈希函数应该具有极低的碰撞概率,以确保数据完整性和安全性。

秃头时刻!!!

3.3 Base64是加密方式吗

Base64编码只是一种编码传输方式,不是加密算法。

它将二进制数据转换为可打印的ASCII字符,常用于在文本协议中传输或存储二进制数据,例如在电子邮件中传输附件、在网页中嵌入图像等。

我们常常会将Base64误解为它是一种加密方式,其实不然,Base64和我们常用的JWT一样,都是一种数据编码传输方式,只不过Base64常用于在文本环境中传输图片、文件。

以下是常用应用场景的详细说明:

  • 在文本环境传输二进制数据:由于某些文本协议或传输机制只支持文本数据,无法直接传输二进制数据。在这种情况下,可以使用Base64编码将二进制数据转换为文本格式,以便在文本环境中传输,例如在电子邮件中嵌入图片或在XML、JSON等格式中传递二进制数据。

  • 数据存储:某些存储系统或数据库可能只接受文本数据,无法直接存储二进制数据。为了在这些系统中存储二进制数据,可以使用Base64编码将其转换为文本格式,然后存储为文本字段。

  • URL传递:某些特定的URL传递场景中,特殊字符如"+"、"/"等会被转义或造成问题。为了避免这些问题,可以使用Base64编码将数据转换为URL安全的字符集,以便在URL中传递。

虽然Base64有以上作用,但它会导致数据膨胀,增加数据的大小。

在传输大量二进制数据或对传输效率有较高要求的情况下,如传输大视频、大图片、大文件等,不易使用。

如果需要在文本环境中传输大文件,可以考虑使用其他更合适的技术,例如使用压缩算法对文件进行压缩,或者使用分布式文件系统或云存储服务,如Minio、OSS,来处理大文件的传输和存储。

秃头时刻!!!

图片

结语

建立这个平台的初衷:

  • 打造一个仅包含前端问题的问答平台,让大家高效搜索处理同样问题。

  • 通过不断积累问题,一起练习逻辑思维,并顺便学习相关的知识点。

  • 遇到难题,遇到有共鸣的问题,一起讨论,一起沉淀,一起成长。

感谢关注微信公众号:“程序员大澈”,然后加入问答群,让我们一起解决实现所有BUG!

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

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

相关文章

Python--练习:报数字(数7)

案例&#xff1a; 一些同学从1开始报数&#xff0c;当需要报出的数字尾数是7或者该数字是7的倍数时&#xff0c;则该同学跳过这个数字&#xff0c;不进行报数。所有同学都参与游戏后&#xff0c;游戏结束。如输入学生数量为50&#xff0c;游戏结束后&#xff0c;报数的同学数量…

【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割6(数据预处理)

由于之前哔站作者整理的LUNA16数据处理方式过于的繁琐&#xff0c;于是&#xff0c;本文就对LUNA16数据做一个新的整理&#xff0c;最终得到的数据和形式是差不多的。但是&#xff0c;主要不同的是代码逻辑比较的简单&#xff0c;便于理解。 对于数据集的学习&#xff0c;可以…

pg 数据库,在新增的数据的时候,根据字段唯一性去更新数据

目录 1 问题2 实现 1 问题 在使用pg 数据库的时候&#xff0c;我们新增数据&#xff0c;希望如果有几个字段和数据库的一样&#xff0c;那么就更新数据&#xff0c;也就是在新增的时候&#xff0c;自动判断是否数据库有这个数据&#xff0c;有就更新&#xff0c;没有就新增 2…

StripedFly恶意软件框架感染了100万台Windows和Linux主机

导语 近日&#xff0c;一款名为StripedFly的恶意软件框架在网络安全研究人员的监视之外悄然感染了超过100万台Windows和Linux系统。这款跨平台的恶意软件平台在过去的五年中一直未被察觉。在去年&#xff0c;卡巴斯基实验室发现了这个恶意框架的真实本质&#xff0c;并发现其活…

网络流学习笔记

网络流基础 基本概念 源点&#xff08;source&#xff09; s s s&#xff0c;汇点 t t t。 容量&#xff1a;约等于边权。不存在的边流量可视为 0 0 0。 ( u , v ) (u,v) (u,v) 的流量通常记为 c ( u , v ) c(u,v) c(u,v)&#xff08;capacity&#xff09;。 流&#xff…

SDK 控件

目录 控件 控件创建 控件的消息处理 总代码 本篇文章对控件的学习&#xff0c;只是对基础的部分&#xff0c;简单的使用&#xff0c;包括消息的处理上&#xff0c;并不涉及深入的内容。 控件 区分控件&#xff0c;资源&#xff1a; SDK通常提供了一系列常用的用户界面控件…

san.js源码解读之模版解析(parseTemplate)篇——readIdent函数

一、源码分析 /*** 读取ident* 这里的 ident 指标识符(identifier)&#xff0c;也就是通常意义上的变量名* 这里默认的变量名规则为&#xff1a;由美元符号($)、数字、字母或者下划线(_)构成的字符串** inner* param {Walker} walker 源码读取对象* return {string}*/ functio…

虎去兔来(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

python爬虫request和BeautifulSoup使用

request使用 1.安装request pip install request2.引入库 import requests3.编写代码 发送请求 我们通过以下代码可以打开豆瓣top250的网站 response requests.get(f"https://movie.douban.com/top250"&#xff09;但因为该网站加入了反爬机制&#xff0c;所以…

Python---练习:有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?

案例&#xff1a; 有一物&#xff0c;不知其数&#xff0c;三三数之余二&#xff0c;五五数之余三&#xff0c;七七数之余二&#xff0c;问物几何&#xff1f; 人话&#xff1a; 有一个数字&#xff0c;不知道具体是多少&#xff0c;用3去除剩2&#xff0c;用5去除剩3&#…

Vue 3.3.6 ,得益于WeakMap,比之前更快了

追忆往昔&#xff0c;穿越前朝&#xff0c;CSS也是当年前端三剑客之一&#xff0c;风光的很&#xff0c;随着前端跳跃式的变革&#xff0c;CSS在现代前端开发中似乎有点默默无闻起来。 不得不说当看到UnoCss之前&#xff0c;我甚至都还没听过原子化CSS[1]这个概念&#xff08;…

业界中说的快速原型法是什么

快速原型法是一种软件开发过程&#xff0c;其核心思想是在开发初期快速构建一个系统的原型&#xff0c;即一个工作模型&#xff0c;以便用户和开发者能够更好地理解系统的需求和功能。这种方法强调快速迭代和用户参与&#xff0c;目的是更早地发现和修正问题&#xff0c;从而提…

微软:Octo Tempest是最危险的金融黑客组织之一

导语 最近&#xff0c;微软发布了一份关于金融黑客组织Octo Tempest的详细报告。这个组织以其高级社交工程能力而闻名&#xff0c;专门针对从事数据勒索和勒索软件攻击的企业。Octo Tempest的攻击手段不断演变&#xff0c;目标范围也不断扩大&#xff0c;成为了电缆电信、电子邮…

回流重绘零负担,网页加载快如闪电

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、回…

椭圆曲线点加的应用计算

一、点加应用 1.1 背景 假设一条椭圆曲线方程为 y^2 =x^3+ax+b确定这条椭圆曲线方程参数是p,a,b,G,n,h,除了参数a,b ,其他参数的意义 p为质数,(mod p)运算G为基点n为点G的阶h是椭圆曲线上所有点的个数m与n相除的商的整数部分1.2 方程(y^2 =x^3+x+6,P=11) 椭圆曲线方程y…

原始流,缓冲流性能比较

一.低级字节流一个一个字节复制 1.代码 package org.example;import java.io.*;public class day13 {//原视频路径private static final String file1 "D:\\temp\\day05\\改名.mp4";//目的视频路径private static final String file2 "D:\\temp\\day05\\不改…

消息队列中间件面试笔记总结RabbitMQ,Kafka,RocketMQ

文章目录 (一) Rabbit MQRabbitMQ 核心概念消息队列的作用Exchange(交换器)Broker&#xff08;消息中间件的服务节点&#xff09;如何保证消息的可靠性如何保证 RabbitMQ 消息的顺序性如何保证 RabbitMQ 高可用的&#xff1f;如何解决消息队列的延时以及过期失效问题消息堆积问…

服务运营 |论文解读: 住院病人“溢出”:一种近似动态规划方法

摘要 在住院床位管理中&#xff0c;医院通常会将住院病人分配到相对应的专科病房&#xff0c;但随着病人的入院和出院&#xff0c;可能会出现病人所需的专科病房满员&#xff0c;而其他病房却有空余床位的情况。于是就有了 "溢出 "策略&#xff0c;即当病人等候时间…

温湿度计传感器DHT11控制数码管显示verilog代码及视频

名称&#xff1a;温湿度计传感器DHT11控制数码管显示 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 使用温湿度传感器DHT11采集环境的温度和湿度&#xff0c;并在数码管显示 本代码已在开发板验证 开发板资料&#xff1a; 大西瓜第一代FPGA升级…

leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间

229. 多数元素 II - 力扣&#xff08;LeetCode&#xff09; 给定一个大小为 n 的整数数组&#xff0c;找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 进阶&#xff1a;尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。 &#xff08;1&#xff09;哈希表 class …