【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

🏆🏆时间过的真快,这是导师回顾新星计划学习的第六篇文章!
最近这段时间非常忙,虽然导师首次参与新星计划活动已经在4月16日圆满结束,早想腾出时间来好好整理活动期间分享的知识点。
🏆🏆非常感谢大家的支持和活动期间的文章输出,导师也是忙里抽空给大家准备分享的内容,也是尽力了,所以分享的知识点主要是偏向于基础和基本的实战,虽然不是讲解的很系统,但是能够了解到一定的实战信息
🏆🏆期待我们的下次学习,导师将会在6月或者7月再次发起新星计划,本次活动也得到学员和平台的肯定,平台也是非常欢迎导师再次发起新星计划,非常感谢!

目录

  • 1、MD5
    • 1.1、基本概念
    • 1.2、碰撞破解
    • 1.3、场景使用
  • 2、知识点
    • 2.1、函数分类
    • 2.2、自定义函数
      • 2.2.1、标量值函数
      • 2.2.2、表值函数
      • 2.2.3、修改函数
    • 2.3、存储过程
      • 2.3.1、创建无参数存储过程
      • 2.3.2、创建有参数存储过程
      • 2.3.3、修改存储过程
  • 3、模拟数据
    • 3.1、创建MD5数据表
    • 3.2、创建MD5标志表
    • 3.3、取值范围函数
    • 3.4、创建存储过程

  • 计划
    在这里插入图片描述

1、MD5

1.1、基本概念

1)MD5的全称,Message-Digest Alg orithm5(信息-摘要算法),在90年代初由Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
2)MD5是一种散列(Hash)算法,散列算法的用途不是对明文加密,目的是让人看不懂,而是通过对信息摘要的比对,防止对原文的篡改。通常对散列算法的“破解”,就是找碰撞。

1.2、碰撞破解

简单的理解,就是通过穷举明文,通过明文加密和当前密文进行对比,如果对比相同值则碰撞破解成功。

1.3、场景使用

说实在的,挺佩服这家公司公司的,就像它页面那句话,本站对于md5、sha1、mysql、ntlm等的实时解密成功率在全球遥遥领先。成立17年,一直被抄袭,从未被超越。运行17年,累计加密数据超过500TB,超过90万亿条记录。
在这里插入图片描述

2、知识点

2.1、函数分类

上一次已经提到过,常见的函数有如下几种:表值函数、标量值函数、聚合函数、系统函数。
这里只简单讲解常见的【系统函数(内置函数)】中的【聚合函数】和【日期和时间函数】,如下图
感兴趣的小伙伴可以查看导师这篇文章:https://blog.csdn.net/lmy_520/article/details/106016101

  • 聚合函数
    在这里插入图片描述
  • 日期和时间函数
    在这里插入图片描述

2.2、自定义函数

关键词:function
上一篇我们也简单讲解了自定义函数的作用和优势,以下再提一下
1)用于计算复杂逻辑,可以返回单个标量值或者结果集
2)能够接收传入参数,单不能输出传出参数
3)优点,模块化、执行速度更快、减少网络流量
如果在程序之间执行,特别是跨服务器数据库,每次需要把一大串执行sql语句通过网络传到目标服务器数据库是需要消耗比较大的流量,
所以定义成函数自然就减少了很多sql语句传送,直接就是一个函数名搞定

2.2.1、标量值函数

  • 代码
-- 创建标量值函数
go
    create function constData(@test int) returns int
    as
    begin
    -- 写自己的逻辑
    set @test+=1
    return @test
    end
go

-- 调用
declare @testValue int
set @testValue=1
select dbo.constData(@testValue) as 返回值
  • 效果
    在这里插入图片描述

2.2.2、表值函数

  • 方式一
-- 定义
create function funcName (@a int) returns table
as
return select top 10 studentName from student_score_20wan

-- 调用
select * from funcName(1)
  • 方式二
go
create function consTable(@test int) returns @tempTable table
(studentName nvarchar(50))
as
begin
    -- 写自己的逻辑
    insert into @tempTable(studentName)
    select top 10 studentName from student_score_30wan
end
go

-- 调用
select * from constTable(1)
  • 两种方式返回的效果
    在这里插入图片描述
  • 温馨提示
    详细可查看官方解释:https://learn.microsoft.com/zh-cn/sql/relational-databases/user-defined-functions/user-defined-functions?view=sql-server-ver16

2.2.3、修改函数

1)可视化界面修改
在这里插入图片描述
2)sql语句进行修改
通过上一步可视化界面点击修改后,同样也是跳转到sql语句界面,在界面可以查看修改使用了alter关键词
在这里插入图片描述

🏆🏆 原则:Write Less Do More!
🍎🍎简介:一只喜欢全栈方向的程序员,专注基础和实战分享,欢迎咨询,尽绵薄之力答疑解惑!

2.3、存储过程

关键词:proc
简单理解,存储过程的主要作用就是更加灵活集中处理各类简单或复杂场景功能,可以有入参和出参,以及获得结果集合。
存储过程优点
1)运行速度快,创建时已经编译,更加安全高效
2)可以编写更加复杂的数据库操作
3)更加能够节省网络流量,一般复杂sql语句肯定会写很多,如果每次都是通过网络传送,那必定消耗很大流量

2.3.1、创建无参数存储过程

可以先判断是否存在,不存在则创建,否则移除再创建或者其他操作
1)格式
create proc 名称
2)代码

-- 创建无参存储过程
if (exists (select * from sys.objects where name = 'proc_myProcOne'))
    drop proc proc_myProcOne
go
create proc proc_myProcOne
as
select top 10 * from student_score

-- 执行存储过程
exec proc_myProcOne;

3)效果
在这里插入图片描述

2.3.2、创建有参数存储过程

1)格式
create proc 名称(参数1,参数2,…)
2)代码

-- 创建多个参存储过程
if (exists (select * from sys.objects where name = 'proc_more_myProcOne'))
    drop proc proc_more_myProcOne
go
create proc proc_more_myProcOne(
    @studentName nvarchar(50),
    @courseName nvarchar(50)
)
as
select top 10 * from student_score 
where studentName=@studentName and courseName=@courseName

-- 执行存储过程
exec proc_more_myProcOne '陈珊歆','语文';

3)效果
在这里插入图片描述

2.3.3、修改存储过程

通过可以通过可视化界面修改,跳转到sql语句
在这里插入图片描述

3、模拟数据

3.1、创建MD5数据表

本次是模拟添加MD5数据,因此表设计如下
基本字段:自增编号、Guid编号、添加时间
表字段:md5加密值,md5密文值、md5长度

create table md5_data_eight
(
    id int identity(1,1) primary key,
    guid_value varchar(50),
    md5_plaintext varchar(100),        -- 明文
    md5_ciphertext varchar(100),    -- 密文
    md5_length int,                    -- 明文长度
    add_time datetime
)

3.2、创建MD5标志表

主要用于记录当前加密到那个组合,就不需要每次都是从第一次开始,比如00000000
只需要每次调用函数时,能够返回当前组合的明文值,然后再在存储过程里对明文进行加密

create table md5_data_eight_flag
(
    id int identity(1,1) primary key,
    p1 int,
    p2 int,
    p3 int,
    p4 int,
    p5 int,
    p6 int,
    p7 int,
    p8 int,
    add_time datetime,                    -- 明文长度
    update_time datetime
)

-- 创建完表后,初始化一条记录
insert into md5_data_eight_flag(p1,p2,p3,p4,p5,p6,p7,p8,add_time,update_time)
values(1,1,1,1,1,1,1,1,getdate(),getdate())

3.3、取值范围函数

1)字母大小写,az和AZ,26+26=52个值
2)阿拉伯数字,0~9,10个值
总共加起来就是52+10=62个值,根据8位长度组合规则,一共有多少总组合?
总共组合值等于62的8次方,组合值=Math.pow(62,8)=218340105584896
在这里插入图片描述
3)通过上面,基数太大,重新调整下取值范围,直接纯数字加密
总共组合值等于10的8次方=Math.pow(10,8)=100000000=1亿条记录

  • 代码
    主要注意返回的字符串,必须加上返回长度,否则可能回只返回一位

-- 定义函数:返回表变量结果集

go
    create function getCurrentPlaintext() returns varchar(8)
    as
    begin
        -- 写自己的逻辑
        -- 定义表变量
        declare @tempTable table(
            id int identity(1,1) primary key, 
            value nvarchar(1)
        )
        
        insert into @tempTable values
        ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'),('8'),('9')
        
        declare @p1 int
        declare @p2 int
        declare @p3 int
        declare @p4 int
        declare @p5 int
        declare @p6 int
        declare @p7 int
        declare @p8 int
        select @p1=p1,@p2=p2,@p3=p3,@p4=p4,
        @p5=p5,@p6=p6,@p7=p7,@p8=p8
        from md5_data_eight_flag

        declare @plaintext varchar(8)
        set @plaintext=''
        select @plaintext+=[value] from @tempTable where id=@p1
        select @plaintext+=[value] from @tempTable where id=@p2
        select @plaintext+=[value] from @tempTable where id=@p3
        select @plaintext+=[value] from @tempTable where id=@p4
        select @plaintext+=[value] from @tempTable where id=@p5
        select @plaintext+=[value] from @tempTable where id=@p6
        select @plaintext+=[value] from @tempTable where id=@p7
        select @plaintext+=[value] from @tempTable where id=@p8
        --print('第一个明文组合:'+@plaintext)

        return @plaintext
    end
go

3.4、创建存储过程

在使用这条语句保存到表时,会发现是乱码,如下
在这里插入图片描述

  • 解决方法
    直接在convert后面加多一个参数2即可,可以复制加密串到在线解密网站进行验证
    在这里插入图片描述
  • 完整代码

go
create proc proc_addMd5
as
begin
    
    declare @plaintext varchar(8)
    declare @ciphertext varchar(100)
    
    select @plaintext=dbo.getCurrentPlaintext()
    --print(@plaintext)

    declare @p1 int
    declare @p2 int
    declare @p3 int
    declare @p4 int
    
    declare @p5 int
    declare @p6 int
    declare @p7 int
    declare @p8 int

    select @p1=p1,@p2=p2,@p3=p3,@p4=p4,
    @p5=p5,@p6=p6,@p7=p7,@p8=p8
    from md5_data_eight_flag

    -- 第一位
    if (@p1+1)>10 begin
        set @p1=1
        
        -- 第二位
        if @p2>10 begin
            set @p2=1

            -- 第三位
            if @p3+1>10 begin
                set @p3=1

                -- 第四位
                if @p4>10 begin
                    set @p4=1

                    -- 第五位
                    if @p5>10 begin
                        set @p5=1

                        -- 第六位
                        if @p6>10 begin
                            set @p6=1

                            -- 第七位
                            if @p7>10 begin
                                set @p7=1

                                -- 第八位
                                if @p8>10 begin
                                    set @p8=8
                                end
                                else begin
                                    set @p8+=1
                                end
                            end
                            else begin
                                set @p7+=1
                            end
                        end
                        else begin
                            set @p6+=1
                        end
                    end
                    else begin
                        set @p5+=1
                    end
                end
                else begin
                    set @p4+=1
                end
            end
            else begin
                set @p3+=1
            end
        end
        else begin
            set @p2+=1
        end
    end
    else begin
        set @p1+=1
    end
    
    
    -- 添加一条记录
    select @ciphertext=convert(varchar(100),HashBytes('md5',@plaintext),2)
    insert into md5_data_eight(guid_value,md5_plaintext,md5_ciphertext,md5_length,add_time)
    values(newid(),@plaintext,@ciphertext,8,getdate())

    -- 更新下一个明文标识
    /*print(@p1)
    print(@p2)
    print(@p3)
    print(@p4)
    print(@p5)
    print(@p6)
    print(@p7)
    print(@p8)*/
    update md5_data_eight_flag set 
    p1=@p1,p2=@p2,p3=@p3,p4=@p4,p5=@p5,p6=@p6,p7=@p7,p8=@p8,
    update_time=getdate()
    where id=1
end
  • 效果
    在这里插入图片描述
  • 简单一点的方式模拟数据
declare @count int
set @count=1000000
while @count>0 begin
    set @count-=1
    exec dbo.proc_addMd5
end

在这里插入图片描述

🍎🍎 本篇到此结束,感谢阅读的小伙伴,打个小小的ad,欢迎关注导师的公众号【有趣小馆】,导师会时不时发布一些有趣好玩的功能,欢迎关注!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unsupervised Learning(无监督学习)

目录 Introduction Clustering(聚类) Dimension Reduction(降维) PCA(Principle component analysis,主成分分析) Word Embedding(词嵌入) Matrix Factorization(矩…

适合嵌入式开发的GUI(嵌入式学习)

嵌入式开发的GUI如何选择? 常见的嵌入式GUI开发方法轻量级GUI库优缺点 基于Web技术优缺点 Qt框架优缺点 原生开发优缺点 嵌入式系统的限制 常见的嵌入式GUI开发方法 嵌入式开发中的GUI(图形用户界面)是指在嵌入式系统中实现图形化的用户界面…

Linux权限管理(超详解哦)

Linux权限 引言文件访问者的分类文件类型与访问权限文件类型访问权限 文件权限值的表示方法修改权限的指令chmod修改文件权限通过角色/-/权限来修改通过三个八进制数修改 chown修改所有者chgrp修改所属组umask修改或查看文件权限掩码文件创建时的权限 目录的权限粘滞位 总结 引…

驱动模块和printk函数

目录 1. 驱动模板 1.1. 在源码工程路径下创建.c文件 1.2. 编写驱动模板 1.3. 将模板放到ubuntu上 1.4. 书写Makefile 1.5. 编译和安装 2. printk 2.1. Source Insight查找命令 2.2. printk讲解 2.2.1. 分析函数 2.2.2. 编写代码 2.3. 拓展 2.3.1. 关于printk函数测…

ESP32开发环境搭建Windows VSCode集成Espressif IDF插件ESP32_IDF_V5.0开发编译环境搭建

一、安装ESP32-IDF库 下载网址:https://dl.espressif.com/dl/esp-idf/ 打开上面的网页,选择单击页面中 ESP32-IDF v5.0.2 - Offine Installer,5.0.2是当前最新版本,如果没有ESP32-IDF v5.0.2 - Offine Installer,说明…

ADB WIFI 链接

ADB WiFi链接手机 必须在同一网络下(本人用的台式机网线手机连路由器WIFI) 1.先确认USB数据线是否成功链接了手机 adb devices不管前面设备是什么名字,但是后面必须为device状态才算链接成功了,offline状态是不行的 有些没开启…

《微服务架构设计模式》第二章 服务的拆分策略

内容总结自《微服务架构设计模式》 服务的拆分策略 一、架构是什么软件架构的41视图模型为什么重要分层架构风格 二、定义微服务如何定义服务拆分难点定义服务API 一、架构是什么 软件架构的定义:计算机系统的软件架构是构建这个系统所需要的一组结构,包…

物联网Lora模块从入门到精通(八)Lora无线通信

一、前言 在某些环境下,无法通过有线传输数据,这时候我们需要使用Lora无线通信传输数据,Lora无线数据传输具有低功耗、距离长的特点,常用于工厂内等,需要Lora基站。 我曾做过距离测试:Lora模块距离测试-物联…

Linux---vim的使用

专栏:Linux 个人主页:HaiFan. 本章为大家带来Linux工具—vim Linux工具 关于rzszyumvim的基本概念vim的基本操作vim正常模式命令集vim末行模式命令集简单vim配置配置文件的位置常用配置选项 关于rzsz 这个工具用于windows机器和Linux机器通过Xshell传输…

PHP伪协议filter详解,php://filter协议过滤器

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 php://filter 一、访问数据流二、过滤数据流三、多…

electron 快速创建一个本地应用

参考官方文档流程 快速入门 | Electron 建议先全局安装electron,npm install -g electron 开发过程中可以在本地开发安装 使用electron快速创建一个web页面 ,参考官方demo 实例 electron-quick-start 第一步: mkdir my-electron-app &am…

Linux

Linux 摘要写在前面1.Linux介绍2.Linux基本概念与命令3.Shell编程4.桌面操作系统框架5.GTK图形编程6.QT图形编程7.DBUS8.GDB9.Wine开发10.高可用存储技术11.高可用网络技术12.云计算 摘要 本篇博客参考中科方德国产操作系统的培训课程,对其主要内容进行总结&#x…

超越密码:网络安全认证的未来

你的物理现实的数字对应物正在惊人地增长。虽然肯定会有积极的结果,但随着互联网的发展,与之相关的风险也在迅速增加。在讨论网络安全风险管理时,首先想到的是密码。但当出现诈骗、网络钓鱼等威胁时,这还不够。 那么,…

大数据分析与机器学习:技术深度与实例解析【上进小菜猪大数据系列】

上进小菜猪,沈工大软件工程专业,爱好敲代码,持续输出干货。 大数据分析与机器学习已成为当今商业决策和科学研究中的关键组成部分。本文将深入探讨大数据技术的背景和原则,并结合实例介绍一些常见的大数据分析和机器学习技术。 …

Redux的基础操作和思想

什么是Redux? Redux是JavaScript应用的状态容器,提供可预测的状态管理! Redux除了和React一起用外,还支持其它框架;它体小精悍(只有2kB, 包括依赖),却有很强大的插件扩展生态! Redux提供的模式和工具使您更容易理解应用程序中的…

与用户同行!2023卡萨帝开启高端生活方式新时代

6月20日,2023思享荟暨卡萨帝品牌升级发布会在重庆国际博览中心举行。在经历了高端产品引领、高端品牌引领、高端场景引领后,卡萨帝启动全新品牌升级,持续与用户同行,开启高端生活方式引领的新时代。 现场,海尔智家副总…

量化交易:止盈策略与回测

我们买基金或股票的时候通常用最简单的策略进行决策:低买高卖,跌的多了就加仓拉低持有成本,达到收益率就卖出。 那么如何用代码表示这个策略呢?首先定义交易信号则是:0.5%时买入,目标止盈线是1.5%&#xf…

ELFK日志分析系统并使用Filter对日志数据进行处理

目录 一、 FilebeatELK 部署Filebeat 节点上操作 二、Filtergrok 正则捕获插件内置正则表达式调用自定义表达式调用 mutate 数据修改插件multiline 多行合并插件date 时间处理插件 一、 FilebeatELK 部署 Node1节点(2C/4G):node1/192.168.15…

Django rest framework基本知识

使用pycharm生成Django项目后,会生成工程目录和app目录 工程目录下5个文件,settings.py是全局配置相关的 urls.py是路有相关的 app相关的目录 models.py 数据库ORM对应的模型类 serializers.py 序列化与反序列化处理 views.py 根据request进行…

手工测试没有前途,自动化测试会取代手工测试?

在测试行业,一个一直被讨论的问题就是:手工测试没有前途,自动化测试会取代手工测试? 首先说结论:自动化测试不会取代手工测试,这完全是两个维度的事情。为什么不会呢?我们需要从本源上说起。 什…