当前位置: 首页 > news >正文

第44章 用户密码实体及其约束规则的定义实现

1 说明:

    由当前程序需要兼容实现多种用户密码的加密操作,所以必须把“CustomerPassword”定义为实体类,该类用于用于把加密方式、密钥及其加密后的密码持久化到“CustomerPassword”表中,以便用为用户登录操作提供验证支撑。

    如果是程序中使用哈西加密方式,且密钥由用户注册或密码修改时随机生成的以增加用户密码的安全性。由于1个指定用户的密钥是随机生成的,且会通过该随机生成的密钥来生成相应的密码,这样做会增加用户密码的安全性,但是在用户用户登录时依然需要该密钥与生成的密码与持久化密码进行匹配,从而实现用户的登录操作,这也是需要把“CustomerPassword”定义为实体类的主要原因。

    如果程序中不定义“CustomerPassword” 实体类,且只使用哈西加密方式,那么就需要把属性成员:

public string Password { get; set; }

public string PasswordSalt { get; set; }

public static int PasswordSaltKeySize => 5;

    public static string DefaultHashedPasswordFormat => "SHA512";

定义到用户实体中,以便把随机生成的密钥持久化到用户表中,以便为1个指定用户使用哈西加密方式执行登录操作时保证同1个密钥,从而保证对明码哈西加密后密码的相等性。

2 Core.Domain.Users.CustomerPassword

namespace Core.Domain.Users

{

    /// <summary>

    /// 【用户密码--类】

    /// <remarks>

    /// 摘要:

    ///     该类中的属性成员实例存储着指定的加密方式及其密钥,为用户输入密码的加密操作提供实例支撑,最后还把加密后的密码字符串存储到该类的属性成员实例中。

    /// </remarks>

    /// </summary>

    public class CustomerPassword : BaseEntity

    {

        #region 拷贝构造方法

        /// <summary>

        /// 【拷贝构造方法】

        /// <remarks>

        /// 摘要:

        ///     通过拷贝构造方法设定当前对用户密码的默认加密方式为明码,即不加密。

        /// </remarks>

        /// </summary>

        public CustomerPassword()

        {

            PasswordFormat = PasswordFormat.Clear;

        }

        #endregion

        #region 属性

        /// <summary>

        /// 【用户编号】

        /// <remarks>

        /// 摘要:

        ///     获取/设置用户实体1个指定实例的长整型编号值。

        /// </remarks>

        /// </summary>

        public long UserId { get; set; }

       

        /// <summary>

        /// 【密码】

        /// <remarks>

        /// 摘要:

        ///    获取/设置经过指定加密方式加密后的密码字符串。

        /// </remarks>

        /// </summary>

        public string Password { get; set; }

        /*

        可逆加密(Encryption)方式和哈希(Hash)加密方式的区别:

           1、可逆加密(Encryption)是可逆的,即明码和加密码之间通过操作是可以相互转换;哈希(Hash)加密方式是不可逆的,哈希(Hash)加密方式一般会导致信息熵减小,即使用哈希(Hash)加密方式转换后可能导致,转换明码是原明码中的一段。

           2、可逆加密(Encryption)的密码会随着明码的长度进行改变;而哈希(Hash)加密方式密码的长度是固定的,且只取决于所使用的算法,当明码的长度大于算法中所规则的长度时,哈希(Hash)加密方式会把明码截断后进行加密操作,这也是导致哈希(Hash)加密方式不可逆的与信息熵减小的根本原因。

           3、应用场景:一般情况下用户密码加密操作使用可逆加密(Encryption)方式;哈希(Hash)加密方式(一般用于数字签名、数据校验(CRCSHAMD5),据说HTTPS协议运行所需要的CA证书就是使用哈希(Hash)算法生成的。

           4、哈希(Hash)加密方式无解密操作,即哈希(Hash)加密方式是不能被解密的,如果用户输入的密码经过哈希(Hash)加密方式加密后的加密字符串与原加密字符相等,则用户通过验证,可以登录了。

        */

        /// <summary>

        /// 【哈希密钥】

        /// <remarks>

        /// 摘要:

        ///     获取/设置哈希(Hash)加密方式所需的密钥字符串(默认:5个字符的字符串)

        ///  说明:

        ///     使用哈希加密方式对用户的密进行加密操作时,所使用的密钥字符串。

        /// </remarks>

        /// </summary>

        public string PasswordSalt { get; set; }

        /// <summary>

        /// 【哈希密钥长度】

        /// <remarks>

        /// 摘要:

        ///     设定哈希(Hash)加密方式所需密钥字符串长度的整型值。

        ///  说明:

        ///     当使用哈希方式对用户的密进行加密操作进行加密操作时,设定密钥字符串的长度值为:5个字符。

        /// </remarks>

        /// </summary>

        public static int PasswordSaltKeySize => 5;

        /// <summary>

        /// 【哈希加密默认编码格式】

        /// <remarks>

        /// 摘要:

        ///     设定哈希加密算法名称的字符串常量(默认:以最高安全性及其最大长度的"SHA512"加密算法,对用户的密码进行加密操作。)

        /// </remarks>

        /// </summary>

        public static string DefaultHashedPasswordFormat => "SHA512";

        /// <summary>

        /// 【可逆加密(Encryption)密钥】

        /// <remarks>

        /// 摘要:

        ///     设定可逆加密密钥的字符串常量(默认:16个字符的高安全性数字型字符串)

        ///  说明:

        ///     使用可逆加密(Encryption)方式对用户的密进行加密操作时,所使用的密钥字符串。

        /// </remarks>

        /// </summary>

        public static string EncryptionKey => CommonHelper.GenerateRandomDigitCode(16);

        /// <summary>

        /// 【加密方式编号】

        /// <remarks>

        /// 摘要:

        ///     1个指定编号值,通过该编号值获取/设置加密方式枚举的1个指定实例。

        /// </remarks>

        /// </summary>

        public int PasswordFormatId { get; set; }

        /// <summary>

        /// 【加密方式】

        /// <remarks>

        /// 摘要:

        ///     获取/设置加密方式枚举的1个指定实例。

        /// </remarks>

        /// </summary>

        public PasswordFormat PasswordFormat

        {

            get => (PasswordFormat)PasswordFormatId;

            set => PasswordFormatId = (int)value;

        }

        /// <summary>

        /// 【默认加密方式】

        /// <remarks>

        /// 摘要:

        ///     设定哈希加密方式对用户密码进行加/解密操作。

        /// </remarks>

        /// </summary>

        public static PasswordFormat DefaultPasswordFormat => PasswordFormat.Hashed;

        #endregion

        #region 属性--映射和级联构建

        /// <summary>

        /// 【单个用户】

        /// <remarks>

        /// 摘要:

        ///     获取/设置1个指定用户实例所对应的1个用户密码实例。

        /// 说明:

        ///     构建用户与用户密码实体及其表之间的1:1映射关系,但在实现和逻辑定义实现上以用户为主。

        /// </remarks>

        /// </summary>

        public virtual User UserSingle { get; set; }

        #endregion

    }

}

3 Data.Mapping.Users.CustomerPasswordBuilder

//Nuget

//Nuget--Microsoft.EntityFrameworkCore.SqlServer

using Microsoft.EntityFrameworkCore;

using Microsoft.EntityFrameworkCore.Metadata.Builders;

//项目

using Core.Domain.Users;

using System.Reflection.Emit;

using System;

namespace Data.Mapping.Users

{

    /// <summary>

    /// 【用户密码生成器--类】

    /// <remarks>

    /// 摘要:

    ///     该类通过对“EntityFrameworkCore”中间件“IEntityTypeConfiguration<TEntity/>泛型接口的“Configure”方法的定义,以实现把用户密码映射实体类及其属性成员相关约束规则及其级联关系定义,映射到用户密码表及其的相应字段上。

    /// </remarks>

    /// </summary>

    public class CustomerPasswordBuilder : IEntityTypeConfiguration<CustomerPassword>

    {

        #region 方法--IEntityTypeConfiguration<>

        ///<param name="builder">实体类型生成器实例,用于把当前程序中指定实体和属性所定义的约束规则,映射到数据库指定表及其字段上。</param>

        /// <summary>

        /// 【配置】

        /// <remarks>

        /// 摘要:

        ///     该方法通过对“EntityFrameworkCore”中间件“IEntityTypeConfiguration<TEntity/>泛型接口的“Configure”方法的定义,以实现把用户密码实体类及其属性成员相关约束规则及其级联关系定义,映射到用户密码表及其的相应字段上。

        /// </remarks>

        /// </summary>

        public void Configure(EntityTypeBuilder<CustomerPassword> builder)

        {

            //由于“EntityTypeBuilder<CustomerPassword>”的参数已经泛型实例化,因此builder后不能再定义为:“builder.Entity<CustomerPassword>().HasKey(customerPassword => customerPassword.Id);”

            //用户表及其字段约束规则,映射定义。

            builder.HasKey(customerPassword => customerPassword.Id);

            //构建用户表与用户密码表1:1映射关系,但在际应用中用户表与用户密码表最多被应用的映射方式为1:n映射关系。

            builder.HasOne(customerPassword => customerPassword.UserSingle)

                .WithOne(user => user.CustomerPasswordSingle)

                .HasForeignKey<CustomerPassword>(customerPassword => customerPassword.UserId)

                .IsRequired();

            builder.Ignore(customerPassword => customerPassword.PasswordFormat);

        }

        #endregion

    }

}

对以上功能更为具体实现和注释见:230211_038shopDemo(用户密码实体及其约束规则的定义实现)。

相关文章:

第44章 用户密码实体及其约束规则的定义实现

1 说明&#xff1a; 由当前程序需要兼容实现多种用户密码的加密操作&#xff0c;所以必须把“CustomerPassword”定义为实体类&#xff0c;该类用于用于把加密方式、密钥及其加密后的密码持久化到“CustomerPassword”表中&#xff0c;以便用为用户登录操作提供验证支撑。 如果…...

聊聊并发与锁

持续坚持原创输出&#xff0c;点击蓝字关注我吧1.并发与并行并发可以充分地利用 CPU 资源&#xff0c;一般都会使用多线程实现。多线程的作用是提高任务的平均执行速度&#xff0c;但是会导致程序可理解性变差&#xff0c;编程难度加大。关于对并发与并行的概念&#xff0c;大家…...

开源项目 —— 原生JS实现斗地主游戏 ——代码极少、功能都有、直接粘贴即用

目录 效果如下 目录结构 GameEntity.js GrawGame.js konva.min.js PlayGame.js veriable.js index.html 结语&#xff1a; 前期回顾 卡通形象人物2 写代码-睡觉 丝滑如德芙_0.活在风浪里的博客-CSDN博客本文实现了包含形象的卡通小人吃、睡、电脑工作的网页动画https://…...

Linux第四讲

目录 四、shell脚本 4.1 shell和shell脚本 4.2 脚本语言分类 4.2.1 编译型语言 4.2.2 解释型语言 4.2.3 脚本语言 4.3 shell常见种类 4.3.1 shell分类介绍 4.3.2 查看bash版本 4.3.3 sh和bash的关系 4.4 脚本书写规范 4.4.1 选择解释器 4.4.2 开发规范 4.5 shell…...

Redis 持久化

持久化是指数据写到物理硬盘里&#xff0c;即便程序崩溃、或者电脑重启&#xff0c;依然能够恢复。Redis提供了两种持久化机制&#xff1a;RDB和AOF。 RDB(Redis Database): RDB文件相当于内存快照&#xff0c;保存了某个时间点数据库信息。使用RDB文件恢复很简单&#xff0c;将…...

Python语言零基础入门教程(十三)

Python 字典(Dictionary) 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key:value 对用冒号 : 分割&#xff0c;每个键值对之间用逗号 , 分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : …...

江苏五年制专转本应该复习几轮?

五年制专转本应该复习几轮&#xff1f; 据调查统计&#xff1a;2022年专转本17%的考生复习三轮及以上&#xff0c;23%的考生复习了两轮。这两类的考生录取率高至85%。可见复习轮数多&#xff0c;专转本上岸的概率也大。综合多方因素&#xff0c;建议同学们专转本复习四轮&#…...

微信小程序的优化方案之主包与分包的研究

什么是分包&#xff1f; 某些情况下&#xff0c;开发者需要将小程序划分成不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 在构建小程序分包项目时&#xff0c;构建会输出一个或多个分包。每个使用分包小程序必定含有一个主包。所谓的…...

从手工测试转型web自动化测试继而转型成专门做自动化测试的学习路线。

在开始之前先自学两个工具 商业web自动化测试工具请自学QTP&#xff1b;QTP的学习可以跳过&#xff0c;我是跳过了的。 开源web自动化测试工具请自学Selenium&#xff1b;我当年是先学watir&#xff08;耗时1周&#xff09;&#xff0c;再学selenium&#xff08;也耗时1周&…...

【计组笔记03】计算机组成原理之系统五大部件介绍、主存模型和CPU结构介绍

这篇文章,主要介绍计算机组成原理之系统五大部件、主存模型和CPU结构。 目录 一、计算机五大部件 1.1、体系结构 (1)冯诺依曼体系结构...

微信小程序解析用户加密数据

微信公众号 IT果果日记前言在上一篇文章“微信小程序如何获取用户信息”中我们完成了用户明文数据的校验工作&#xff0c;本文将学习解密用户的非明文用户信息&#xff0c;也就是获取用户的openId和unionId。解密调用wx.getUserProfile后将返回encryptedData和iv两个数据。encr…...

毕业四年换了3份软件测试工作,我为何仍焦虑?

​今天一看日历&#xff1a;2023.2.11 &#xff0c;才突然意识到自己毕业已经四年了。四年时间里一直在测试行业摸爬滚打&#xff0c;现在是时候记录一下了。 下面我来分享下我这4年软件测试经验及成长历程&#xff0c;或许能帮助你解决很多工作中的迷惑。 01、我是如何开始做…...

嵌入式C基础知识(7)

是否可以传递任何参数并从 ISR 返回值不可以。不能传递任何参数并从 ISR 返回值。 ISR 不返回任何内容&#xff0c;并且不允许传递任何参数。 当硬件或软件事件发生时调用 ISR&#xff0c;而代码不会调用它。 这就是为什么不向 ISR 传递参数的原因。 由于代码不调用 ISR&#x…...

大数据系列之:安装pulsar详细步骤

大数据系列之&#xff1a;安装pulsar详细步骤一、Pulsar版本和jdk对应关系二、安装JDK三、设置和激活jdk环境变量四、下载和解压Pulsar五、查看Pulsar目录六、启动Pulsar standalone cluster七、创建Kafka Topic八、往Topic写入数据九、消费pulsar的Topic一、Pulsar版本和jdk对…...

色彩-基础理论

颜色三大指标 色相 色相是颜色的一个属性&#xff0c;只有黑白灰没有色相这个属性(那银灰色是什么&#xff1f;) 颜色的相貌&#xff0c;指的也是给颜色一个名字 例如&#xff1a;暗红、酒红、土黄、墨绿 饱和度 颜色的鲜艳程度 纯度 饱和度主要取决于含色成分和消色成分&a…...

1629_MIT_6.828_xv6_chapter1操作系统的组织

全部学习汇总&#xff1a;GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次整理一下操作系统组织相关的知识&#xff0c;主要还是xv6教学操作系统相关的知识。当然&#xff0c;很多知识在这类技术领域是通用的。 1. 操作系统的主要功能…...

基于Golang哈希算法监控配置文件变化

SHA(secure hashing algorithm)表示安全哈希算法.SHA是MD5的修正版本&#xff0c;用于数据摘要和认证。哈希和加密类似&#xff0c;唯一区别是哈希是单项的&#xff0c;即哈希后的数据无法解密。SHA有不同的算法&#xff0c;主要包括SHA-1, SHA-2, SHA-256, SHA-512, SHA-224, …...

关于一笔画问题的一些思考(欧拉路Fleury算法、逐步插入回路法、以及另一种可能的解法)

前言这是一个经典的图论问题了最近复习离散的时候又恰好看到了&#xff0c;发现自己以前的解法似乎有点bug然后开始出反例卡自己&#xff0c;结果发现卡不掉&#xff1f;然后再好好想了想&#xff0c;发现这个看起来有问题的做法可能确实没问题。注意&#xff1a;欧拉路、欧拉回…...

vlookup怎么用详细步骤,看这一篇就够了

1、vlookup函数&#xff1a;使用方法 以下便是vlookup函数&#xff0c;功能、语法和参数用法&#xff1a; excel函数vlookup 2、vlookup函数&#xff1a;查询参数 首先&#xff0c;选中F2单元格&#xff0c;然后在编辑栏输入函数公式&#xff1a;VLOOKUP(E2&#xff0c;B&…...

雅思经验(9)之小作文常用词汇总结

写作&#xff1a;关于趋势的上升和下降在小作文中&#xff0c;真的是非常常见的&#xff0c;所以还是要积累一下。下面给出了很多词&#xff0c;但是在雅思写作中并不是词越丰富&#xff0c;分数就越高的。雅思写作强调的是准确性&#xff1a;在合适的地方用合适的词和句法。不…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...