Taro + node.js 注册 仿照java 中的加盐算法
1.需求
为了让用户的密码更加保密
我们在md5 之前 在加一个随机数 用java 的说法 叫做 加盐算法
2.代码
//H5注册async H5Register(register) {if (!register.phone ||!register.password ||!register.confirmPassword ||!register.yzmCode ||!register.registerCode) {throw new CoolCommException('参数不能为空~');}const phoneRegex = /^1[3-9]\d{9}$/; // 手机号码的正则表达式if (!phoneRegex.test(register.phone)) {throw new CoolCommException('手机号码格式不正确~');}if (register.password !== register.confirmPassword) {throw new CoolCommException('两次密码不一致');}const inviteCode = await this.businessUserEntity.findOneBy({inviteCode: register.registerCode,});if (!inviteCode) {throw new CoolCommException('导师不存在~');}const checkV = await this.captchaCheckByH5(register.yzmCode);if (checkV) {const user = await this.businessStudentEntity.findOneBy({phone: register?.phone,});if (user) {throw new CoolCommException('账户已存在~');}const salt = this.generatePasswordCode();await this.businessStudentEntity.save({phone: register.phone,password: md5(register.password + salt).toUpperCase(),membershipLevel: 0,balance: 0,userId: inviteCode.id,randomStr: salt,});return 1;} else {throw new CoolCommException('验证码不正确~');}}
//生成加盐密码public generatePasswordCode() {// const hmac = crypto.createHmac('sha256', '1234567890');// hmac.update(password.toString());// const hash = hmac.digest('hex');// const code = hash.substring(0, 6).toUpperCase();// return code;let chars = 'ABCDEFGHJKMNPQRSTWXYZ1234567890';/****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/let maxPos = chars.length;var code = '';for (let i = 0; i < 6; i++) {code += chars.charAt(Math.floor(Math.random() * maxPos));}return code.toString();}
3 登录验证
为了适配之前的纯md5 方式
// H5 登录async H5Login(login) {if (!login.password || !login.phone) {throw new CoolCommException('账户或者密码不能为空~');}let user;// 尝试使用直接MD5加密的密码进行验证const userByDirectMd5 = await this.businessStudentEntity.findOneBy({phone: login.phone,password: md5(login.password),});// 如果没有找到,尝试使用带有随机字符串的加密方式if (!userByDirectMd5) {const userInfo = await this.businessStudentEntity.findOneBy({phone: login.phone,});if (!userInfo) {// 手机号不存在,直接返回错误throw new CoolCommException('账户不存在或密码不正确~');}const userByRandomStrMd5 = await this.businessStudentEntity.findOneBy({phone: login.phone,password: md5(login.password + userInfo.randomStr).toUpperCase(),});if (!userByRandomStrMd5) {// 密码不正确throw new CoolCommException('账户不存在或密码不正确~');}// 这里可以设置 user 为使用随机字符串加密方式找到的用户user = userByRandomStrMd5;} else {// 这里设置 user 为使用直接MD5加密方式找到的用户user = userByDirectMd5;}// 检查账户是否启用if (user.isEnabled == 0) {throw new CoolCommException('账户无权限,请联系客服开通~');}// 生成和缓存JWT令牌const { expire, refreshExpire } = this.coolConfig.jwt.token;const result = {expire,token: await this.generateTokenClient(user, expire),refreshExpire,refreshToken: await this.generateTokenClient(user, refreshExpire, true),};// 缓存令牌await this.cacheManager.set(`business:client:token:${user.id}`,result.token,{ ttl: expire });await this.cacheManager.set(`business:client:token:refresh:${user.id}`,result.refreshToken,{ ttl: refreshExpire });return result;}
相关文章:
Taro + node.js 注册 仿照java 中的加盐算法
1.需求 为了让用户的密码更加保密 我们在md5 之前 在加一个随机数 用java 的说法 叫做 加盐算法 2.代码 //H5注册async H5Register(register) {if (!register.phone ||!register.password ||!register.confirmPassword ||!register.yzmCode ||!register.registerCode) {thr…...
全量知识系统问题及SmartChat给出的答复 之9 三套工具之4语法解析器 之2
Q23. 一个语言的语法简约规则 这些规则显示show 在一个给定单词(a given word)的右边或左边可能出现的单词的类别。句型的多样性variety不是复杂文法(a complex grammar)的结果,而是简单语法(a simple gra…...
简洁版用户登录系统
前端页面: 用户登录首页: <!doctype html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximu…...
Android 监听网络状态变化
文章目录 Android 监听网络状态变化封装工具类使用 Android 监听网络状态变化 封装工具类 <uses-permission android:name"android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name"android.permission.ACCESS_WIFI_STATE"…...
【LeetCode】一周中的第几天+ 一年中的第几天
2023-12-30 文章目录 一周中的第几天方法一:模拟思路步骤 方法二:调用库函数方法三:调用库函数 [1154. 一年中的第几天](https://leetcode.cn/problems/day-of-the-year/)方法一:直接计算思路: 方法二:调用…...
深度学习 精选笔记(10)简单案例:房价预测
学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…...
DBGridEh 的排序
DBGridEh 可以点列抬头使得记录按该列排序 不需要写代码,只需要设置好,它就能排序。 网上的文章一般写了如何设置。但一般都少说了一条。 先说如何设置: 1. OptionsEh.AutoSortMarking 设置为 True,如果是设计期属性面板&…...
spring-boot-starter-parent和spring-boot-dependencies介绍
springboot项目的pom文件中,我们经常看见这样(下图)两种springboot的版本依赖管理方式;图片中的这两种依赖声明方式任意用其中一种都可以。文章后面会简单阐述一下区别和使用场景。 事例中完整的pom文件 <?xml version"1.0" encoding&quo…...
缓存穿透解决方案之布隆过滤器
布隆过滤器可以快速判断数据是否存在,避免从数据库中查询数据是否存在,减轻数据库的压力 布隆过滤器是由一个初值为0的bit数组和N个哈希函数,可以用来快速的判断某个数据是否存在 当我们想要标记某个数据是否存在时,布隆过滤器会…...
pptx和ppt有什么区别?了解两者之间的微妙差异
在现代办公和学习环境中,PowerPoint已成为我们生活中不可或缺的一部分。随着技术的不断进步,PowerPoint的格式也在不断更新。对于许多初学者,可能会对PPT和PPTX这两种格式感到困惑。本文旨在深入探讨PPTX与PPT之间的主要差异,帮助…...
LabVIEW水下温盐深数据一体化采集与分析
LabVIEW水下温盐深数据一体化采集与分析 开发一个基于LabVIEW的水下温盐深数据一体化采集与分析系统,实现海洋环境监测的自动化和精确化。通过集成温度、盐度和深度传感器,结合USB数据采集卡,利用LabVIEW软件开发的图形化界面,实…...
适配器模式 详解 设计模式
适配器模式 适配器模式是一种结构型设计模式,其主要作用是解决两个不兼容接口之间的兼容性问题。适配器模式通过引入一个适配器来将一个类的接口转换成客户端所期望的另一个接口,从而让原本由于接口不匹配而无法协同工作的类能够协同工作。 结构 适配…...
探索rsync远程同步和SSH免密登录的奥秘
目录 集群分发脚本xsyncscp(secure copy)安全拷贝rsync 远程同步工具集群分发脚本 SSH免密登录免密登录原理SSH免密登录配置生成公钥和私钥授权测试 在现代科技飞速发展的时代,数据的备份和迁移成为了一个重要的课题。其中,rsync远…...
JavaScript new、apply call 方法
new、apply、call、bind JavaScript 中的 apply、call和 bind 方法是前端代码开发中相当重要的概念,并且与 this 的指向密切相关 new new 关键词的主要作用 就是执行一个构造函数、返回一个实例对象 根据构造函数的情况,来确定是否可以接受参数的传递…...
助力智能化农田作物除草,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建农田作物场景下玉米苗、杂草检测识别分析系统
在我们前面的系列博文中,关于田间作物场景下的作物、杂草检测已经有过相关的开发实践了,结合智能化的设备可以实现只能除草等操作,玉米作物场景下的杂草检测我们则少有涉及,这里本文的主要目的就是想要基于DETR模型来开发构建玉米…...
O(1)转移线性dpLeetCode 2369. 检查数组是否存在有效划分
一、题目 1、题目描述 给你一个下标从 0 开始的整数数组 nums ,你必须将数组划分为一个或多个 连续 子数组。 如果获得的这些子数组中每个都能满足下述条件 之一 ,则可以称其为数组的一种 有效 划分: 子数组 恰 由 2 个相等元素组成…...
【力扣hot100】刷题笔记Day17
前言 今天竟然不用开组会!天大的好消息,安心刷题了 46. 全排列 - 力扣(LeetCode) 回溯(排列) class Solution:def permute(self, nums: List[int]) -> List[List[int]]:# 回溯def backtrack():if len(…...
leetcode日记(34)通配符匹配
这道题做了很久很久……一开始我想用的方法是使用双指针,分别指向两数组,然后依次按照题目中的规则遍历,做了很久发现时间超限了!这是我最后超时的代码! class Solution { public:bool isMatch(string s, string p) {…...
一张图读懂人工智能
一、生成人工智能的概念和应用,以及如何使用大型语言模型进行聊天和创造原创内容。这项技术将会对人类和企业产生深远影响。 计算机获得学习、思考和交流的能力,被称为生成人工智能。生成人工智能可以立即获得人类所有知识的总和,并回答任何…...
5.37 BCC工具之uflow.py解读
一,工具简介 uflow工具用于跟踪方法的进入和退出事件,并打印一个可视化的流程图,显示方法是如何进入和退出的,类似于带有断点的跟踪调试器。这对于理解Java、Perl、PHP、Python、Ruby和Tcl等高级语言中的程序流非常有用,这些语言为方法调用提供了USDT探测。 二,代码示例…...
终极指南:Microsoft BASIC M6502 字符串处理技术解析
终极指南:Microsoft BASIC M6502 字符串处理技术解析 【免费下载链接】BASIC-M6502 Microsoft BASIC for 6502 Microprocessor - Version 1.1 项目地址: https://gitcode.com/gh_mirrors/ba/BASIC-M6502 Microsoft BASIC for 6502 Microprocessor(…...
别再自己造轮子了!用这个Vue3+Java开源WMS,30分钟搞定仓库管理系统部署
30分钟极速部署:基于Vue3Java开源WMS的实战指南 当业务部门突然提出仓库管理需求时,技术团队常面临两难选择:自研周期长、成本高,而商业系统又存在预算和定制化难题。今天介绍的这套开源WMS解决方案,正是为解决这种困境…...
镜像视界提出3D Spatial Agent:AI正式进入空间时代——从“理解内容”到“计算空间”的范式跃迁
一、开篇:AI的下一个时代,不在模型,而在空间过去十年,人工智能行业迎来了以大模型为核心的爆发式增长浪潮,这一浪潮彻底重塑了机器与数据的交互方式。以OpenAI为代表的前沿机构,凭借突破性的语言模型技术&a…...
【词汇专栏】MoE(混合专家):为什么 DeepSeek 又快又省钱?
MoE(混合专家):为什么 DeepSeek 又快又省钱? DeepSeek-V3 有 6710 亿个参数,但运行速度比 GPT-4o 还快?Gemini 1.5 Pro 能处理 100 万词元(Token)还不崩溃?这背后的秘密&…...
从零搭建到安全加固:CMAK for Apache Kafka 生产环境部署全记录(含LDAP配置避坑)
从零构建金融级Kafka监控体系:CMAK生产部署与LDAP深度集成实战 金融科技场景下的Kafka集群管理,从来都不只是技术参数的简单堆砌。当某跨国支付平台因监控盲区导致消息积压事故时,他们最终选择了CMAK作为监控解决方案——这个源自Yahoo开源的…...
OpenCV实战:5分钟搞定图像颜色识别(附完整代码)
OpenCV实战:5分钟搞定图像颜色识别(附完整代码) 在数字图像处理领域,颜色识别是一项基础但极其重要的技术。无论是工业质检中的产品分拣,还是智能交通中的信号灯识别,甚至是日常生活中的照片滤镜应用&#…...
Flowable流程定义怎么存?MySQL+MongoDB混合存储方案实战(附SpringBoot3+Vue3代码)
Flowable混合存储架构实战:MySQL与MongoDB的协同设计 当企业级工作流系统遇到海量流程定义管理时,传统单一数据库架构往往面临性能瓶颈。我曾主导过一个电商订单审批系统的重构项目,最初采用纯MySQL存储BPMN文件时,仅300个流程定义…...
一条命令搞定OpenClaw部署?先看清PPClaw的真实代价
先说结论PPClaw的核心价值在于将OpenClaw的部署从本地环境配置转为云端托管,用API Key和命令行替代了服务器运维。它确实降低了初始部署门槛,但引入了新的依赖:PPIO平台、API Key计费模型和网络稳定性。更适合小团队快速验证或原型开发&#…...
智能驾驶中的环境感知与决策控制
智能驾驶中的环境感知与决策控制 随着人工智能和传感器技术的飞速发展,智能驾驶正逐步从实验室走向现实道路。环境感知与决策控制是智能驾驶系统的核心,它们决定了车辆能否安全、高效地行驶。环境感知负责识别周围车辆、行人、交通标志等信息࿰…...
从零开始掌握时序逻辑电路:状态机设计与FPGA实战解析
1. 时序逻辑电路基础入门 第一次接触时序逻辑电路时,我盯着教科书上的波形图发呆了半小时。直到在实验室用FPGA开发板亲眼看到LED灯随着时钟信号有规律地闪烁,才真正理解这个抽象概念。时序逻辑电路和组合逻辑电路最大的区别,就像音乐会现场和…...
