密钥派生算法介绍 及 PBKDF2(过时)<Bcrypt(开始淘汰)<Scrypt< Argon2(含Argon2d、Argon2i、Argon2id)简介

密钥派生算法介绍

https://blog.csdn.net/xcxhzjl/article/details/127297263

一、定义

密钥派生函数(Key Derivation Function)就是从一个密码产生出一个或多个密钥,具体就是从一个master key,password或者passphrase派生出一个或多个密钥,派生的过程使用PRF(Pseudo Random Function)。是一种实现key stretching(密钥延长算法,即一种更慢的哈希算法,用于将初始密钥转换成增强密钥,在计算过程中刻意延长时间或者消耗空间,这样有利于保护弱密码)的方法。

●最简单的KDF可以直接使用某种密码学散列算法,如:SHA256。将一个密码转换为一个散列值作为密钥。但易受字典攻击。

二、分类

根据派生源的不同,我们可以将密钥派生算法简单分为两种:

●HKDF(HMAC-based key derivation),基于HMAC的密钥派生算法

使用另一个随机数(salt)作为输入密钥,利用如HMAC-SHA256的HMAC算法对既有密钥派生新的密钥,并将salt与派生密钥一起存储,用于以后再次从这个既有密钥中派生出相同的派生密钥。salt通常不是私密的,并且可以重用。加盐(salt)可以防止彩虹表导致的密码泄露。

●从一个密码派生出一个或多个密钥:PBKDF2、Bcrypt、Scrypt、Argon2 

三、两种密钥派生算法

1、PBKDF2(CPU-Hard algorithm)

是一种基于密钥派生出密钥的算法,需要消耗很多算力,可防止暴力破解加密。

  1. passphrase -> [dklen, salt, c] > 1000] -> hash

  2. DK = PBKDF2(PRF, Password, Salt, c, dkLen)

其中,

passphrase:用于用户认证或者加密程序的操作步骤

dklen:派生所产生的密钥的长度

salt:盐值是一串随机生成的比特

c:迭代的次数

DK:期望的密钥derived key

PRF(Pseudorandom function):伪随机数产生的密钥,如:hmac-sha256

2、Scrypt(Memory-Hard algorithm)

是一种password-base KDF算法,比起PBKDF2需要消耗更多的资源。Scrypt内部用的是PBKDF2算法,不过内部会长时间的维护一组比特数据,这些数据会在生成复杂的salt的过程中反复加密。

3、区别

总结:PBKDF2是算力消耗性的,Scrypt是资源消耗性的。

PBKDF2和Scrypt都是密钥派生函数(KDFs),它们通过故意减慢计算速度来实现密钥延长,特别是通过用一个可调参数来控制速度。不同之处在于,Scryp需要大量且可调整的内存量才能进行高效计算。这样能防止专有硬件ASIC/FPGA的暴力破解。

参考博客(比较深入):

密码学学习笔记_01_密码学综述 - 知乎 (zhihu.com)

创建数字钱包(零)KDF 密钥派生算法 - 腾讯云开发者社区-腾讯云 (tencent.com)

密码学学习笔记_03_随机数与密钥派生 - 知乎 (zhihu.com)

-----------------------------(分割线)--------------------------------

密钥派生函数 Scrypt、Bcrypt 与 Argon2 - 写给开发者的实用密码学

https://zhuanlan.zhihu.com/p/612120129

https://zhuanlan.zhihu.com/p/557583762

以下介绍了三种密钥派生函数( KDF )的特点与使用建议,并给出了 Python 演示代码

相关的原文链接:

Bcrypt - Practical Cryptography for Developers (nakov.com)
Scrypt - Practical Cryptography for Developers (nakov.com)
Argon2 - Practical Cryptography for Developers (nakov.com)

PBKDF2(已经过时)  https://zhuanlan.zhihu.com/p/557583762

PBKDF2是一个简单的从密码派生密钥的KDF,它可以抵抗字典攻击和彩虹表攻击。

PBKDF2的思路是对密码和某些填充做多次迭代的HMAC来派生密钥。PBKDF2算法在RFC 2898 (PKCS #5).标准中有描述。

PBKDF2的算法公式描述如下:

key = pbkdf2(password, salt, iterations-count, hash-function, derived-key-len)
  • password : 密码/口令等
  • salt : 密码学安全伪随机数组
  • iterations-count : 迭代次数,如1024
  • hash-function : 用于HMAC的散列函数,如SHA256
  • derived-key-len : 派生密钥长度(字节数),如32

目前PBKDF2已经是一种过时的不安全的KDF算法,建议使用ScryptArgon2来代替它。

因为PBKDF2不抗GPU攻击( GPU-resistant),也不抗ASIC攻击( ASIC-resistant),因此在某些专业的服务器上被攻破的可能性较大,包括配置了专业显卡GPU的服务器或使用专门设计的硬件电路(ASIC)的服务器。
现代的KDF比如 ScryptArgon2都能抵抗字典攻击、GPU攻击与ASIC攻击,因为它们的算法在设计上就要消耗大量CPU与RAM内存资源,且不能通过GPU或ASIC来实现快速的并行计算。
GPU攻击与ASIC攻击在本质上是一种野蛮的试图攻破散列函数的攻击,因此现代KDF的设计目标之一就是使这种野蛮破解的成本上升到实际不可能实现的程度。

Bcrypt (开始淘汰)

Bcrypt 也是一个 KDF ,问世时间早于 Scrypt ,对于 ASIC 、GPU 攻击的抗性相对弱一些。其虽然也可以配置迭代数,但由于对内存的压力较小,因此比较容易构建相应的硬件加速密码破解器。

来自 https://zhuanlan.zhihu.com/p/557583762 的说法: 

Bcrypt是一个开始被淘汰的密码学KDF。它提供可配置的迭代次数,但使用恒定的内存,因此相对来说,比较容易被硬件加速密码破解器所破解,在抗GPU攻击和抗ASIC攻击上已经不再安全。 

算法参数、盐、Hash 的共同存储

在很多的应用、框架和工具中(比如 WordPress 站点的数据库),Bcrypt 加密后的密码都是和算法设置以及盐保存在一起的,体现为一个单一的字符串(字符串有着特定的格式)。这个字符串包含数个部分,以 $ 符号分割。例如,密码 p@ss~123 以 Bcrypt 标准格式存储的形式就是下面这样的(给出三个例子是为了方便读者看清特征):

$2a$07$wHirdrK4OLB0vk9r3fiseeYjQaCZ0bIeKY9qLsNep/I2nZAXbOb7m
$2a$12$UqBxs0PN/u106Fio1.FnDOhSRJztLz364AwpGemp1jt8OnJYNsr.e
$2a$12$8Ov4lfmZZbv8O5YKrXXCu.mdH9Dq9r72C5GnhVZbGNsIzTr8dSUfm

什么时候用 Bcrypt ?

在配置合适的前提下,Bcrypt 被认为是安全的 KDF 函数,在实践中应用广泛。但由于 Scrypt 比 Bcrypt 更加安全,因此很多应用更倾向于使用 Scrypt(或 Argon2 )。但我个人更推荐使用 Argon2 。

Scrypt

Scrypt 是一个强大的密钥派生函数,其通过内存密集的计算方式来抵抗 GPU、ASIC、FPGA 这类密码破解硬件的攻击。

Scrypt 接收多个输入参数,进行计算后输出密钥:

key = Scrypt(password, salt, N, r, p, derived-key-len)

其中的参数被称为" Scrypt 配置参数",说明如下:

  • N - 迭代次数,将影响 CPU 和内存用量,例:16384 、2048 ;
  • r - 块大小,将影响 CPU 和内存用量,例:8 ;
  • p - 并行因数 (并行运行的线程数,将影响 CPU 和内存用量),通常为 1 ;
  • password - 输入的密码(推荐至少为 8 - 10 个字符);
  • salt - 安全产生的随机字节序列(最小为 64 位,推荐 128 位);
  • derived-key-len - 输出的密钥要有多少字节长,例如 32 (256 位)

Scrypt 计算过程中的每一步都会 按照强相关的顺序 访问内存,这就让内存读写性能成为了算法速度的瓶颈。Scrypt 运行时所需的内存量可以通过下面的公式来计算:

所需内存 = 128 * N * r * p 字节

例如:128 * N * r * p = 128 * 16384 * 8 * 1 = 16MB(或 128 * 2048 * 8 * 1 = 2MB)

具体怎么选择参数,要取决于我们能够等待的时间和所需的安全等级(即抗破解的能力):

  • 用于交互式登录的示例参数:N=16384, r=8, p=1(RAM = 16MB)。交互式的登录一般耗时都要小于 0.5s ,所以必须快速完成计算。同样的,对于服务端而言,如果同时有很多用户登录,那么 Scrypt 的缓慢会拖慢整个系统;
  • 用于文件加密的示例参数:N=1048576, r=8, p=1(RAM = 1GB)。当要加密硬盘时,通常不会频繁解密数据(一天可能只解密 2 ~ 3次),所以你可能会愿意多等 2 ~ 3 秒作为提升安全性的代价。

你可以在开发自己的 app 或系统的过程中,自己多选几组参数进行测试。应该总是选择所用语言和平台所支持的、速度最快的 Scrypt 实现,因为尝试破解密码的人一定会选用最快的这个库。某些实现(如 python 实现)可能会比最快的实现慢上 100 倍。

在 MyEtherWallet 加密钱包应用中,默认的参数是 N=8192, r=8, p=1 。对于此类应用而言,该强度不够高,但可以通过要求用户输入又长又复杂的密码来对抗密码破解攻击。

示例 - Python 中的 Scrypt

接下来,我们在 Python 中使用 Scrypt 来体验从密码派生密钥的过程。首先,使用 pip 安装 scrypt 包:

pip install scrypt

注意,scrypt 包依赖 OpenSSL ,所以要先在默认目录中安装 OpenSSL (Windows 下可能为: C:\OpenSSL-Win64),然后再安装 scrypt python 包。

装好 scrypt 包后,通过如下 Python 代码来计算 Scrypt hash 值:

(本例中使用了较小的迭代数,这么做只是希望减少所需的时间。实际应用中推荐使用 16384 )

import pyscrypt
​
salt = b'aa1f2d3f4d23ac44e9c5a6c3d8f9ee8c'
passwd = b'p@$Sw0rD~7'
key = pyscrypt.hash(passwd, salt, 2048, 8, 1, 32)
print("Derived key:", key.hex())

Scrypt 接收的参数:password(字节序列)、salt(字节序列)、迭代数、每次迭代的块大小、并行因数、输出密钥长度(派生密钥的字节数)。上面代码的输出如下:

Derived key: b'e813a6f6ccc4e9110193bf9efb7c0a489d76655f9e36629dccbeaf2a73bc0c6f'

可以试着修改迭代数或块大小参数,来这些参数的变化对于执行时间的影响。不过别忘了,上面的 Python Scrypt 是一个比较慢的实现,如果要实际应用,可以试着找些更快的库

译注:所需要的密钥长度为 32 字节,而上面输出的实际长度为 64 字节,这是正确的结果。 我们在参数中写的"密钥长度"指的是【密钥二进制长度为32字节,即256位】,而由于真正包含8位信息的一个字节中的大部分是不可打印的,这就意味着它们无法被显示。因此,通行表示字节的方式是使用 16 进制字符(即字符 0 ~ f )。这样的一个字符只能表示 4 位的信息量,所以我们需要两个这样的字符才能涵盖完整的 8 位(即 1 字节)信息。这也就造成了最终我们得到的密钥字符长度是实际二进制密钥长度的 2 倍

算法参数、盐、Hash 的共同存储

在很多的应用、框架和工具中,Scrypt 加密后的密码都是和算法设置以及盐保存在一起的,体现为一个单一的字符串(以特定的格式)。这个字符串包含数个部分,以 $ 符号分隔。例如,密码 p@ss~123 以 Scrypt 标准格式存储的形式就是下面这样的(给出三个例子是为了方便读者看清特征):

16384$8$1$kytG1MHY1KU=$afc338d494dc89be40e317788e3cd9166d066709db0e6481f0801bd918710f46
16384$8$1$5gFGlElztY0=$560f6229356c281a525fad4e2fc4c209bb55c21dec789381335a32bb84888a5a
32768$8$4$VGhlIHF1aWo=$54d657cec8b3aaca675b407e790bccf1dddb0a23665cd5f994820a736d4b58ba

什么时候用 Scrypt ?

在配置合适的前提下,Scrypt 被认为是高度安全的 KDF 函数,所以可以用在任何需要 KDF 的地方——加密钱包、文件、App 密码等场景都可以

Argon2

Argon2 是一个现代的 抗ASIC、抗GPU 的安全密钥派生函数。在配置得当、且消耗资源相当的情况下,其相较于 PBKDF2、Bcrypt 和 Scrypt ,有着更强的密码破解抗性。

Argon2 变种

Argon2 有多个变种:

  • Argon2d - 提供强大的 GPU 攻击抗性,但在非常特殊的情况下,会有被旁路攻击的风险;
  • Argon2i - 提供弱一些的 GPU 攻击抗性,但没有被旁路攻击的风险;
  • Argon2id - 是上面两种变体的混合版,推荐使用这个版本

Argon2 的配置参数

Argon2 有如下几个配置参数,和 Scrypt 很像:

  • 密码 P : 要被 hash 的密码(或消息 message );
  • 盐 S : 随机生成的盐(用于密码 hash 时,推荐使用 16 字节长度的盐);
  • 迭代数 t : 要进行的迭代次数;
  • memorySizeKB m : 要使用的内存大小(单位为 kbytes) ;
  • parallelism p : 并行程度(即线程数);
  • outputKeyLength T : 想要算法返回的字节长度

示例 - Python 中的 Argon2

接下来我们写一些代码,来在 Python 中使用 Argon2 进行密钥派生。

首先,用下面的命令安装 python 包 argon2_cffi :

pip install argon2_cffi

用下面的代码来计算 Argon2 :

import argon2, binascii
​
hash = argon2.hash_password_raw(time_cost=16, memory_cost=2**15, parallelism=2, hash_len=32,password=b'password', salt=b'some salt', type=argon2.low_level.Type.ID)
print("Argon2 raw hash:", binascii.hexlify(hash))
​
argon2Hasher = argon2.PasswordHasher(time_cost=16, memory_cost=2**15, parallelism=2, hash_len=32, salt_len=16)
hash = argon2Hasher.hash("password")
print("Argon2 hash (random salt):", hash)
​
verifyValid = argon2Hasher.verify(hash, "password")
print("Argon2 verify (correct password):", verifyValid)
​
try:argon2Hasher.verify(hash, "wrong123")
except:print("Argon2 verify (incorrect password):", False)

上面的代码首先生成一个 "raw hash" (256 位密钥),这一步是基于 argon2 的密钥派生,和 Scrypt 类似。下一步会派生一个 argon2 hash ,其中包含了算法参数、盐和派生密钥,可以用于后续的密码存储和验证。这段代码的最后将对密码进行验证。

Argon2 接收如下几个输入配置参数:time_cost(时间消耗,即迭代次数)、memory_cost(要使用的 KB 数)、parallelism(并行度,使用多少个线程)、hash_len(派生密钥的长度)、salt_len(随机生成盐的长度,通常是 128 位 / 16 字节)。

上面代码的示例输出如下:

Argon2 raw hash: b'157f21dd3fdf7bafb76d2923ccaffa0b7be7cbae394709474d2bc66ee7b09d3e'
Argon2 hash (random salt): $argon2id$v=19$m=32768,t=16,p=2$Rfy6J41W9idBU+n/8sZc6Q$i3QYYPtoogIAw78I2qqlUQ8vjzUXGG1V6QsBOq2NIp4
Argon2 verify (correct password): True
Argon2 verify (incorrect password): False

上面输出中的 argon2 hash 是标准格式的:【配置参数 + 派生密钥 + 随机盐】。按照设计,每次代码执行时所用的盐和派生密钥都应该是不同的。

试着多执行几次上面的代码,会发现派生密钥总是相同的(因为盐相同),而派生的 argon2 hash 则每次都不同(这部分所用的随机盐是每次执行时在算法内部重新生成的)。

可以试着修改 time_cost 和 memory_cost 设置,来感受一下它们将如何影响密钥派生时间。

算法参数、盐、Hash 的共同存储

在很多的应用、框架和工具中,Argon2 加密后的密码都是和算法设置以及盐保存在一起的,体现为一个单一的字符串(字符串有着特定的格式,就如上面展示的那样)。这个字符串包含数个部分,以 $ 符号分割。例如,密码 p@ss~123 以 Argon2 标准格式存储的形式就是下面这样的(给出三个例子是为了方便读者看清特征):

$argon2d$v=19$m=1024,t=16,p=4$c2FsdDEyM3NhbHQxMjM$2dVtFVPCezhvjtyu2PaeXOeBR+RUZ6SqhtD/+QF4F1o
$argon2d$v=19$m=1024,t=16,p=4$YW5vdGhlcnNhbHRhbm90aGVyc2FsdA$KB7Nj7kK21YdGeEBQy7R3vKkYCz1cdR/I3QcArMhl/Q
$argon2i$v=19$m=8192,t=32,p=1$c21hbGxzYWx0$lmO1aPPy3x0CcvrKpFLi1TL/uSVJ/eO5hPHiWZFaWvY

上面的几个 hash 值都保存了相同的密码,但都有着不同的算法参数和不同的盐。

Argon2有三个变体:

  • Argon2d : 速度比较快,对GPU攻击具有很高的抵抗力,适用于不受侧信道攻击威胁的应用程序,比如加密货币。
  • Argon2i : 速度较慢,对GPU攻击抗力相对较弱,但不会受到侧信道攻击。
  • Argon2id : Argon2i和Argon2d的混合体,即对GPU攻击具有很高的抵抗力,也不会受到侧信道攻击。推荐首选的Argon2算法。 

什么时候用 Argon2 ?

在配置合适的前提下,Argon2 被认为是高度安全的 KDF 函数,是目前产业界能用到的最佳选择之一,所以可以用在任何需要 KDF 的地方——加密钱包、文件、App 密码等场景都可以。一般来说,Argon2 是最为推荐的 KDF ,优于 Scrypt, Bcrypt 和 PBKDF2 。

总体而言,安全高度上: Argon2 > Scrypt > Bcrypt(开始淘汰) > PBKDF2(过时)

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

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

相关文章

HCIP-Datacom-ARST必选题库_23_SNMP【1道题】

一、单选 1.某中型规模园区网络通过SNMP协议管理网络,该园区对于网络安SNMP哪个版本进行管理? 所有版本均可以实现 BSNMPV1 SNMPV2C SNMPV3

都2024 年了,可以卸载的VS Code 插件

在 VS Code 中,庞大的插件市场提供了丰富多样的扩展功能,以增强编码体验和效率。然而,如果你安装了很多插件,就可能会导致: 性能下降:过多的插件可能导致 VS Code 的启动速度变慢,特别是在启动或…

[2021最新]大数据平台CDH存储组件kudu之启用HA高可用(添加多个master)

今天在做kudu高可用的时候没有参考官网,直接按照常规方式(添加角色—>编辑属性—>启动)结果发现报错?然后参考了一下文档之后发现这玩意儿还有点玄学,做一下记录。 1.添加两个master。kudu master有leader和foll…

薪酬调整流程:规范流程并确保公平合理

薪酬调整是企业人力资源管理中不可或缺的一环,它直接关系到员工的切身利益和企业的发展。为了确保薪酬调整的公平性和合理性,制定一套规范的薪酬调整流程至关重要。本文将详细阐述薪酬调整流程的各个环节,以及如何确保流程的合理性和公平性。…

用云手机运营TikTok有什么好处?

在数字化浪潮的推动下,社交媒体平台正重塑商业推广与品牌建设的面貌。TikTok,这款全球热门的短视频应用,已经吸引了亿万用户的瞩目。对于出海电商和品牌推广而言,借助云手机运营TikTok,能够解锁更多潜在可能&#xff0…

【Linux开发 第十二篇】搭建JavaEE环境

搭建开发环境 搭建javaEE环境 搭建javaEE环境 在Linux下开发JavaEE需要安装软件包: 安装jdk 安装步骤: 在opt目录下创建jdk目录通过xftp上床到jdk目录中进入到jdk目录中,解压jdk压缩包在/usr/local下创建java目录将解压完成的jdk文件移动…

时间搜索

时间搜索 vue2antd <a-form-item label"订单开始时间:"><a-range-picker v-model"date" valueFormat"YYYY-MM-DD" change"onChange" /></a-form-item> onChange (date) {if (date.length > 0) {this.queryParam.…

li 与 li 之间有看不见的空白间隔是什么原因引起的?如何解决?

浏览器会把inline内联元素间的空白字符&#xff08;空格、换行、Tab等&#xff09;渲染成一个空格。 为了美观&#xff0c;通常是一个放在一行&#xff0c;这导致换行后产生换行字符&#xff0c;它变成一个空格&#xff0c;占用了一个字符的宽度。 解决办法&#xff1a; &…

【MySQL | 第六篇】数据库三大范式

文章目录 6.数据库设计三大范式6.1第一范式6.2第二范式6.3第三范式6.4反范式设计 6.数据库设计三大范式 6.1第一范式 第一范式&#xff08;1NF&#xff09;&#xff1a;确保每列的原子性(强调的是列的原子性&#xff0c;即列不能够再分成其他几列)。实际上&#xff0c;第一范式…

MATLAB初学者入门(10)—— 粒子群算法

粒子群优化&#xff08;Particle Swarm Optimization, PSO&#xff09;是一种基于群体协作的优化技术&#xff0c;它由社会行为模型&#xff08;如鸟群觅食行为&#xff09;启发而来。PSO 通过模拟一群粒子&#xff08;候选解&#xff09;在解空间中的移动来寻找最优解。每个粒…

react学习(一)之初始化一个react项目

React 是一个用于构建用户界面&#xff08;UI&#xff09;的 JavaScript 库&#xff0c;用户界面由按钮、文本和图像等小单元内容构建而成。React 帮助你把它们组合成可重用、可嵌套的 组件。从 web 端网站到移动端应用&#xff0c;屏幕上的所有内容都可以被分解成组件&#xf…

在React Router 6中使用useRouteLoaderData钩子获取自定义路由信息

在 React Router 6 中怎么像vueRouter一样&#xff0c;可以在配置路由的时候&#xff0c;定义路由的元信息(附加信息)&#xff1f;答案是可以的。稍有些复杂。核心是通过为每个路由定义了一个 loader 函数,用于返回自定义的路由信息&#xff0c;然后通过useRouteLoaderData 钩子…

Java使用百度翻译接口开发app

到网站&#xff1a;百度翻译开放平台下载Java版本的demo 使用demo中的三个文件&#xff0c;main不用 默认返回的result内容是这样的: {"from":"en","to":"zh","trans_result":[{"src":"Sure! Heres a sh…

虚拟机扩容方法

概述 我的虚拟机开始的内存是40G,接下来要扩成60GB 扩容步骤 步骤1 步骤2 步骤3 修改扩容后的磁盘大小&#xff0c;修改后的值只可以比原来的大&#xff0c;修改完成后点击扩展&#xff0c;等待扩展完成 步骤4 虽然外面扩展成功&#xff0c;但是新增的磁盘空间虚拟机内部还…

GHO文件安装到Vmware的两种姿势

1、使用 Ghost11.5.1.2269 将gho转换为vmdk文件(虚拟机硬盘)&#xff0c;Vmware新建虚拟机自定义配置&#xff0c;然后添加已有的虚拟硬盘文件。 注意ghost的版本&#xff0c;如果你是用Ghost11.5备份的gho文件&#xff0c;再用Ghost12把gho文件转换为vmdk&#xff0c;则vmdk文…

Sound Siphon for Mac:音频处理与录制工具

Sound Siphon for Mac是一款专为Mac用户设计的音频处理与录制工具&#xff0c;以其出色的性能、丰富的功能和简便的操作而备受赞誉。 Sound Siphon for Mac v3.6.8激活版下载 该软件支持多种音频格式&#xff0c;包括MP3、WAV、AAC、FLAC等&#xff0c;用户可以轻松导入各种音频…

openwrt 挂载 usb摄像头 video-uvc mjpg-streamer

安装 # 安装vidoe uvc opkg install kmod-video-core kmod-video-uvc# 插入USB摄像头检测支持情况 dmesg|grep usb# 下载camwww # https://sourceforge.net/projects/mjpg-streamer/ # 解压后将 www 文件修改为camwww, 然后将camwww上传到路由器/www/目录下# 安装camwww 实现推…

小程序中Java后台调用getAccessToken接口、msg_sec_check接口检测文本安全、小程序前端访问后端接口的方法

序言:书接上回 小程序中Java后台调用接口(getAccessToken)获取调用凭据,调用接口(msgSecCheck)检测文本内容是否安全–最终版 小程序服务端后台 Java代码编写,框架采用SSM架构搭建 第一步:添加需要的pom.xml依赖配置 <!-- 小程序文本安全检测接口所需的依赖 --&g…

vue源码解析patch.js

前言&#xff1a;在vue2.0 中&#xff0c;VNode转换成真正的DOM是通过patch(oldVNode,VNode,hydrating)方法实现的。 源码目录&#xff1a;/vue/src/core/vdom/patch.ts // oldVnode 一个真实的DOM或者一个Vnode对象// vnode 一个待替换的Vnode对象// hydrating 是否支持服务端…

镜像VS快照详细对比

不同之处 依赖性&#xff1a; 快照通常依赖于原始系统的状态或之前的快照。 而镜像是独立的&#xff0c;包含了所需的全部数据。 目的&#xff1a; 镜像用于创建或恢复整个系统&#xff0c;适用于系统迁移、备份或恢复等场景。 快照用于数据恢复&#xff0c;可以快速回滚到之前…