来了解一下ASN.1?

news2024/12/26 15:25:43

想要了解证书,必须先了解ASN.1和编码规则。这篇文章简单介绍ASN.1,不过分探讨细节,大家如果有兴趣可以继续深入研究。

一、ASN.1

ASN.1是Abstract Syntax Notation One(抽象文法描述语言)的缩写。计算机系统之间交换的数据消息如果用ASN.1进行描述,可以减少了双方的沟通成本。

ASN.1作为抽象描述文法,将现有的数据类型抽象描述成近20种数据类型。这些数据类型主要分为两大类:基本类型和结构类型。ASN.1的数据类型几乎概括了现实世界中存在的所有数据类型,具有相当的通用性。

基本类型又称为原子类型,是构成其他结构类型的成员类型,如

  1. 布尔值类型:BOOLEAN

  2. 整型:INTEGER

  3. 字符串:OCTET STRING

  4. 空:NULL

结构类型又称为复合类型,如

  1. 有序成员固定结构:SEQUENCE

  2. 无序成员固定结构:SET

1.1实战

通过一个实例我们看看怎样使用ASN.1。

我们先创建一个ASN1格式的schema,该schema表示用户信息,里面有用户名和用户描述。然后填写数据,将数据进行编解码。大家可以用https://asn1.io/asn1playground/default.aspx来做实验。

1.1.1schema

首先创建改结构对应的ASN.1描述。

--<ASN1.HugeInteger World-Schema.Rocket.range>--
World-Schema DEFINITIONS AUTOMATIC TAGS ::= 
BEGIN
  Rocket ::= SEQUENCE       
  {
     name      UTF8String (SIZE(1..16)),
     message   UTF8String (SIZE(1..16))
  }                                                     
END

1.1.2设置数据

有了schema后,我们对该结构进行赋值,可以使用ASN.1格式或json格式赋值。

# ASN.1格式
value Rocket ::= {
  name "Falcon",
  message "hh"
}

# Json
{
  "name":"Falcon",
  "message":"hh"
}

1.1.3编码

然后我们将数据编码为需要的格式,如ber、der、per、uper、oer、coer、xml等,编码结果如下所示:

hh.PDU.ber

hh.PDU.der

hh.PDU.xml

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

1.1.4解码

我们尝试解码der文件,如果没有schema,解析的内容如下图所示:

image-20230115181115540.png
如果有对应的schema,解析出的内容存放在txt或json中:

image-20230115181155854.png

hh.PDU.der.json

hh.PDU.der.txt

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

1.2代码实现

如果用代码,如何实现上述功能呢?本次用php实现,大家需要安装https://github.com/fgrosse/PHPASN1。

代码主要包含4部分内容:

  1. 先对结构进行赋值

  2. 然后将数据进行der编码和base64编码

  3. 编写该结构对应的schema(这个其实可以放在最开始编写)

  4. 将编码后的数据进行解析(支持base64编码或der编码的数据),解析完成后,便可获取各个数据

<?php

#namespace FG\Test\ASN1;

namespace FG\Test\ASN1;

use FG\ASN1\Identifier;
use FG\ASN1\TemplateParser;
use FG\ASN1\Universal\BitString;
use FG\ASN1\Universal\Integer;
use FG\ASN1\Universal\ObjectIdentifier;
use FG\ASN1\Universal\Sequence;
use FG\ASN1\Universal\Set;
use FG\ASN1\Universal\CharacterString;
use FG\ASN1\Universal\UTF8String;

//use PHPUnit_Framework_TestCase;

class TemplateParserTest //extends PHPUnit_Framework_TestCase
{
    public function testParseBase64()
    {
        #1.赋值
        $sequence = new Sequence(
           // new Set(
                //new ObjectIdentifier('ID Number'),
                new UTF8String("Falcon"),
                new UTF8String("hh")
           // )
        );

        #2.der编码后,做base64编码
        $data = base64_encode($sequence->getBinary());
        var_dump($sequence->getBinary(),$data);

        #3.schema结构
        $template = [
            Identifier::SEQUENCE => [
               // Identifier::SET => [
                    //Identifier::OBJECT_IDENTIFIER,
                    Identifier::UTF8_STRING,
                    Identifier::UTF8_STRING,
               // ]
            ]
        ];

        #4.解析
        $parser = new TemplateParser();
        $object = $parser->parseBase64($data, $template);
        var_dump($object);

        var_dump("-------------");
        var_dump($object->getChildren()[0]->getContent());
        var_dump("-------------");

//        $this->assertInstanceOf(Set::class, $object[0]);
//        $this->assertInstanceOf(ObjectIdentifier::class, $object[0][0]);
//        $this->assertInstanceOf(Sequence::class, $object[0][1]);
//        $this->assertInstanceOf(Integer::class, $object[0][1][0]);
//        $this->assertInstanceOf(BitString::class, $object[0][1][1]);
        $object = $parser->parseBinary($sequence->getBinary(),$template);
        var_dump($object);
    }
}
require_once __DIR__ . '/vendor/autoload.php';
$parse = new TemplateParserTest();
$parse->testParseBase64();

输出如下:

➜  myproject php asn1.php
string(14) "0

             Falcon
                   hh"
string(20) "MAwMBkZhbGNvbgwCaGg="
object(FG\ASN1\Universal\Sequence)#8 (4) {
  ["children":protected]=>
  array(2) {
    [0]=>
    object(FG\ASN1\Universal\UTF8String)#9 (5) {
      ["value":protected]=>
      string(6) "Falcon"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(6)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
    [1]=>
    object(FG\ASN1\Universal\UTF8String)#10 (5) {
      ["value":protected]=>
      string(2) "hh"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(2)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
  }
  ["iteratorPosition":"FG\ASN1\Construct":private]=>
  int(2)
  ["contentLength":"FG\ASN1\ASNObject":private]=>
  int(12)
  ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
  int(1)
}
string(13) "-------------"
string(6) "Falcon"
string(13) "-------------"
object(FG\ASN1\Universal\Sequence)#11 (4) {
  ["children":protected]=>
  array(2) {
    [0]=>
    object(FG\ASN1\Universal\UTF8String)#12 (5) {
      ["value":protected]=>
      string(6) "Falcon"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(6)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
    [1]=>
    object(FG\ASN1\Universal\UTF8String)#13 (5) {
      ["value":protected]=>
      string(2) "hh"
      ["checkStringForIllegalChars":"FG\ASN1\AbstractString":private]=>
      bool(false)
      ["allowedCharacters":"FG\ASN1\AbstractString":private]=>
      array(0) {
      }
      ["contentLength":"FG\ASN1\ASNObject":private]=>
      int(2)
      ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
      int(1)
    }
  }
  ["iteratorPosition":"FG\ASN1\Construct":private]=>
  int(2)
  ["contentLength":"FG\ASN1\ASNObject":private]=>
  int(12)
  ["nrOfLengthOctets":"FG\ASN1\ASNObject":private]=>
  int(1)
}

二、编码规则

ASN.1应用越来越广泛的主要原因之一是这种抽象文法描述与几种标准化编码规则联系在一起。这些编码规则规定了如何在非传输介质下实现ASN.1定义的数据类型与字节流的相互转换。因为编码规则是针对ASN.1的数据类型而制定的,因此可以称这些编码规则为ASN.1的编码规则。

ASN.1的编码规则是把使用ASN.1语言说明的数据转化成一种标准格式的系列规则,同时,保证转换后的数据在任意操作系统中,只要使用相同编码规则的解码器就可以解码获得原始数据。

目前,ASN.1的标准化编码规则有以下几种:BER(Basic Encoding Rules),DER(Distinguished Encoding Rules),PER(Packed Encoding Rules)和CER(Canonical Encoding Rules)等。我们简单介绍一下BER(基本编码规则)和DER(定长编码规则)。

2.1BER

BER编码信息由以下几部分组成:

① 标识串,表示要编码的 ASN.1 类型的标识类和标识码以及使用的编码方法(是简单型还是结构型)。

② 长度串,定长型编码方法中它表示内容串的长度,非定长编码方法中它表示长度不定。

③ 内容串,简单定长型编码方法中它表示要编码类型值的具体内容,结构型编码方法中表示各个成员编码的串联。

④ 内容结束串,只有在结构非定长型编码方法中表示内容串的结束,其他方法中该串省略。

对一个 ASN.1 对象的 BER 编码有三种模式,使用哪一种模式取决于该对象的类型和该类型数据的长度是否已知,

不同模式下编码信息中每个组成部分的编码规则不同。主要为基本类型定长模式、结构类型定长模式、结构类型非定长模式。

hh.PDU.ber

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

2.2DER

DER编码是ASN.1数据类型中具有唯一编码的编码规则。DER编码是BER编码的子集,是将每一个ASN.1抽象对象

类型表示成唯一的1和0码字符串的编码规则。这种编码规则是为需要编码成唯一比特串的应用系统而制定的,特

别是在应用安全技术的应用系统中,由于安全加密技术要求输入数据是字节流的形式,并且是与原数据唯一对应的

字节流,因此需要使用DER编码来实现数据结构的编码。

DER编码称为有关安全技术的应用系统的最佳选择。它基本上继承了BER编码规则,同样,也有三种编码方法。但

为了保证编码结果的唯一性,DER 编码在 BER 编码规则的基础上又附加了一些规则:

① 必须使用定长模式编码。

② 对于内容长度小于127的类型值,长度串编码必须采用短型。

③ 对于内容长度大于128的类型值,长度串编码必须采用长型,同时长度串编码的字节个数必须是最少的。

④ 对于简单字符串类型和从简单字符串类型通过隐式派生得到的类型,必须使用基本类型定长模式编码方法。

⑤ 对于结构类型、从结构类型通过隐式派生得到的类型,以及从任何类型通过显示派生得到的类型,必须使用结

构类型定长模式编码方法。

hh.PDU.der

链接: https://pan.baidu.com/s/1Zz8dJCErDe1Fiz57oQF4Pg  密码: 2wdr

如果Name类型ASN.1描述如下图:

image-20230115223425434.png

将数据使用基本类型定长模式编码后的结果为:

image-20230115223607034.png

三、使用

现在很多内容都使用ASN.1描述,如密码算法、数字证书等。

3.1密码算法ASN.1描述

PKCS #7 v1.5描述了密码消息的通用语法。该语法允许嵌套,如一个数字信封可以包含另一个数字信封,或可以对已做数字信封的数据进行签名;该语法也允许扩展各种属性,还可以用于分发证书和CRL。PKCS #7与PEM兼容,可以直接将加密的消息转换成PEM消息,反之亦然。PKCS #7支持多种基于证书的管理系统,PEM就是其中之一。在RFC 5652中有增强定义。该标准主要包括消息通用语法和6种内容类型(明文、签名、信封、签名信封、摘要、密文)。

① 消息通用语法用ASN.1描述如下:

Contentlnfo::= SEQUENCE{

    contentType ContentType,

    content

    [0] EXPLICIT ANY DEFINED BY contentType OPTIONAL

}

ContentType:= OBJECT IDENTIFIER

② 明文消息内容用ASN.1描述如下:

Data ::= OCTET STRNG

③ 签名消息内容用ASN.1描述如下:

SignedData ::= SEQUENCE {

    version Version,

    digestAlgorithms DigestAlgorithmldentifiers,

    contentInfo Contentlnfo,

    certificates [0] IMPLICIT ExtendedCertificatesAndCertificates

    OPTIONAL,

    Crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,

    signerlnfos Signerlnfos

}

DigestAlgorithmldentifiers ::= SET OF DigestAlgorithmldentifier

Signerlnfos ::= SET OF Signerlnfo

Signerlnfo ::= SEQUENCE {

    version Version,

    issuerAndSeriaINumber IssuerAndSerialNumber,

    digestAlgorithm DigestAlgorithmldentifier,

    authenticatedAttributes [0] IMPLICIT Attributes OPTIONA L,

    digestEncryptionAlgorithm DigestEncryptionAIgorithmldentitler,

    encryptedDigest EncryptedDigest,

    unauthenticatedAttributes [1] IMPLJC.IT Attributes OPTIONAL

}

EncryptedDigest ::= OC.TET STRING

Digestlnfo ::= SEQUENCE {

    digestAlgorithum DigestAlgorithmldentifier,

    digest Digest

}

Digest ::= OCTET STRING

④ 信封消息内容用ASN.1描述如下:

EnvelopedData ::= SEQUENCE {

    version Version,

    recipientlnfos Recipientlnfos.

    encryptedContentlnfo EncryptedContentlnfo

}

Recipientlnlos ::= SET OF Recipientlnfo

EncryptedContentInfo ::= SEQUENCE {

    contentType ContentType,

    contentEncryptionAlgorithm

    ContentEncryptionAlgorithmldentifier,

    encryptedContent [0] IMPLICLT EncryptedContent OPTIONAL

}

EncryptcdContenr ::= OCTET STRING

Recipientlnfo ::= SEQUENCE {

    version Version,

    issuerAndSerialNumber IssuerAndSerialNumber,

    keyEncryptionAlgorithm

    KeyEncryptionAlgorithmldentifier,

    encryptedKey EncryptedKey

}

EncryptedKey ::= OCTET STRING

⑤ 签名信封消息内容用 ASN.1描述如下:

SignedAndEnvelopedData ::= SEQUENCE {

    version Version,

    recipientlnfos Recipientlnfos,

    digestAlgorithms DigestAlgorithmldetifiers,

    encryptedContentlnfo EncryptedComentlnfo,

    certificates [0] IMPLICIT ExtendedCertificatesAndCertificates

    OPTIONAL,

    Crls [1] IMPLICIT CertificateRevocationLists OPTIONAL,

    signerlnfos Signerlnfos

}

⑥ 摘要消息内容用 ASN.1描述如下:

DigestedData ::= SEQUENCE{

    version Version,

    digestAlgorithm DigestAlgorithmldentifier,

    contentlnfo Contentlnfo,

    digest Digest

}

Digest ::= OCTET STRING

⑦ 密文消息内容用ASN.1描述如下:

EncryptedData ::= SEQUENCE {

    version Version,

    encryptedContentlnfo EncryptedContentlnfo

}

3.2数字证书ASN.1描述

X.509数字证书用ASN.1描述如下:

 Certificate ::= SEQUENCE {

  tbsCertificate TBSCertificate,

  signatureAlgorithm AlgorithmIdentifier,

  signature BIT STRING

  }

  TBSCertificate ::= SEQUENCE {

  version [0] EXPLICIT Version DEFAULT v1,

  serialNumber CertificateSerialNumber,

  signature AlgorithmIdentifier,

  issuer Name,

  validity Validity,

  subject Name,

  subjectPublicKeyInfo SubjectPublicKeyInfo,

  issuerUniqueID [1] IMPLICIT UniqueIdentifier OPTIONAL,

  -- If present, version must be v2or v3

  subjectUniqueID [2] IMPLICIT UniqueIdentifier OPTIONAL,

  -- If present, version must be v2or v3

  extensions [3] EXPLICIT Extensions OPTIONAL

  -- If present, version must be v3

  }

  Version ::= INTEGER {

  v1(0), v2(1), v3(2)

  }

  CertificateSerialNumber ::= INTEGER

  Validity ::= SEQUENCE {

  notBefore CertificateValidityDate,

  notAfter CertificateValidityDate

  }

  CertificateValidityDate ::= CHOICE {

  utcTime UTCTime,

  generalTime GeneralizedTime

  }

  UniqueIdentifier ::= BIT STRING

  SubjectPublicKeyInfo ::= SEQUENCE {

  algorithm AlgorithmIdentifier,

  subjectPublicKey BIT STRING

  }

  Extensions ::= SEQUENCE OF Extension

  Extension ::= SEQUENCE {

  extnID OBJECT IDENTIFIER,

  critical BOOLEAN DEFAULT FALSE,

  extnValue OCTET STRING
  }

四、总结

通过这篇文章,大家应该能够了解ASN.1的价值和使用方法。

发送/接受方或标准化组织等制定好对应的schema,使用方按照该schema进行赋值,然后将数据转换为ber、der等格式,接收方根据指定的schema进行解析,就能获取到对应数据。

五、资料

  1. ASN.1格式数据编解码总结

  2. ASN.1描述与实例

  3. ASN.1编码方式详解

  4. Golang asn1.Marshal函数代码示例

  5. 高效的5G ASN.1编解码工具

  6. 网页版ASN1解码工具使用教程

  7. https://asn1.io/asn1playground/

  8. 如何解析ASN.1值表示法格式

  9. Go - 解码/编码asn.1

  10. PHPASN1:一个PHP库,用于使用ITU-T X.690编码规则对任意ASN.1结构进行编码和解码-源码下载

  11. php asn.1,A PHP library to encode and decode arbitrary ASN.1 structures using ITU-T X.690 encoding r…

  12. GitHub - fgrosse/PHPASN1: A PHP library to encode and decode arbitrary ASN.1 structures using ITU-T

  13. ThinkPHP5——引用vendor或extend里的第三方类(多种方法)

  14. PKCS规范

  15. x509及其ASN.1表示法

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

  1. 设计模式

  2. 招聘

  3. 思考

  4. 存储

  5. 算法系列

  6. 读书笔记

  7. 小工具

  8. 架构

  9. 网络

  10. Go语言

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

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

相关文章

Android Studio 阅读 frameworks/base 下的代码

从网上搜的方案都是生成 android.ipr&#xff0c;但是这个需要整编&#xff0c;整编一次比较费时费劲&#xff0c;所以想了个巧招 首先用 Android Studio 打开 frameworks/base&#xff0c;其文件夹目录大概形如下&#xff1a; ├── Android.bp├── Android.mk├── api …

入门深度学习——基础知识总结(python代码实现)

入门深度学习——基础知识总结&#xff08;python代码实现&#xff09; 目前&#xff0c;AI基本上可以说是烂大街了。几乎什么都可以说使用了AI技术&#xff0c;听起来很拉风&#xff0c;很nb的样子。而其中目前最为火热的非深度学习&#xff08;Deep Learning&#xff09;莫属…

VisionPro (R) QuickBuild 工具使用问题解决 自用

右击我的电脑选择属性。搜索“安全中心” 点击病毒和威胁保护 在病毒和威胁保护中选择威胁信息&#xff08;当前威胁-保护历史记录&#xff09; 受影响的项目 file: C:\WINDOWS\sysWOW64\cognex.dll 相机和光源不能同时触发&#xff0c;光源要先于相机触发并且持续相机采集…

leetCode周赛-328

相关题解题目一&#xff1a;6291. 数组元素和与数字和的绝对差题目二&#xff1a;6292. 子矩阵元素加 1题目三&#xff1a;6293. 统计好子数组的数目题目四&#xff1a;2538. 最大价值和与最小价值和的差值题目一&#xff1a;6291. 数组元素和与数字和的绝对差 题目链接&#…

Web Security 之 Insecure deserialization

Insecure deserialization 在本节中&#xff0c;我们将介绍什么是不安全的反序列化&#xff0c;并描述它是如何使网站遭受高危害性攻击的。我们将重点介绍典型的场景&#xff0c;并演示一些 PHP、Ruby 和 Java 反序列化的具体示例。最后也会介绍一些避免不安全的反序列化漏洞的…

14正交向量与子空间

正交向量与子空间 本章研究的重点还是之前提到过的子空间&#xff0c;但是本章我们主要从正交的角度来探讨这些子空间具有的性质&#xff0c;主要内容见下图。 注意&#xff0c;上图指出了我们之前没有关注到的子空间的一些性质&#xff1a;对于一个矩阵&#xff0c;其零空间…

微信推送消息给女友提醒每天天气情况,本文讲解流程,附带代码,可快速上手。

实现的效果图 此模板为自己添加的&#xff0c;各位看客可以自行添加&#xff0c;如何添加接着往下看。备注在数据库自定义设置。如果你非专业人士&#xff0c;可以联系作者给你专属设置。如果需要代为设置跳转到文章结束位置。 完整的代码 代码下载地址 微信公众号设置 申…

《Linux Shell脚本攻略》学习笔记-第八章

8.1 简介 TCP/IP网络的运作过程就是在节点之间传递分组。每一个分组中都包含了目标的IP地址以及处理分组中数据的应用程序端口号。 当节点接收到分组时&#xff0c;它会查看自己是否就是改分组的目的地。如果是&#xff0c;节点会再检查端口号并调用相应的应用程序来处理分组数…

Cookie 会话身份验证是如何工作的?

在 Web 应用程序中&#xff0c;Cookie-Session 是一种标准的身份验证方法。饼干&#xff0c;也被称为“sweet cookies”。类型为“小文本文件”&#xff0c;是指一些网站为了识别用户身份而存储在客户端的数据。Session的主要功能是通过服务器记录用户的状态。 在典型的在线购物…

类与类之间关系的表示方式

1.关联关系 关联关系是对象之间的一种引用关系&#xff0c;用于表示一类对象与另一类对象之间的联系&#xff0c;如老师和学生&#xff0c;师傅和徒弟&#xff0c;丈夫和妻子等。关联关系是类与类之间最常用的一种关系&#xff0c;分为一般关联关系&#xff0c;聚合关系和组合…

郭天祥十天入门单片机学习笔记

电子元件 排阻 有两种&#xff1a; nn1 二极管 几个概念 限流电阻&#xff1a;与二极管串联&#xff0c;防止电流过大烧毁二极管导通压降&#xff1a;二极管亮起的最小电压 贴片式绿色为阴极&#xff0c;插入式短脚为阴极 数码管 共阴极&#xff1a;对应段选信号置1亮…

测试开发 | 这些常用测试平台,你们公司在用的是哪些呢?

测试管理平台是贯穿测试整个生命周期的工具集合&#xff0c;它主要解决的是测试过程中团队协作的问题。在整个测试过程中&#xff0c;需要对测试用例、Bug、代码、持续集成等等进行管理。下面分别从这四个方面介绍现在比较流行的管理平台。 图片108091 50.2 KB 测试用例管理平台…

Doris 使用记录(随机更新(ง •_•)ง)

文章目录知识点常见数据分布方式使用表动态分区Hash分桶知识点 常见数据分布方式 分布式数据库中常见的数据分布方式。 轮询&#xff1a;Round-Robin&#xff0c;假设分桶数为3&#xff0c;数据按顺序依次写入桶1、桶2、桶3&#xff0c;然后继续循环。 区间&#xff1a;Ran…

【Lp-CVT and Applications】

Lp-CVT and Applications 论文笔记 本文是论文 Lp Centroidal Voronoi Tessellation and its Applications 的学习笔记。有不足之处&#xff0c;请指出&#xff01;非常感谢&#xff01; 1 主要工作 解决问题&#xff1a;推广CVT以适用各向异性和六面体网格划分。推广 CVT &am…

如何模拟实现一个“缓存”?

目录 前言 一、LRU Cache是什么 二、模拟实现 2.1、通过继承 LinkedHashMap 模拟实现 2.2、自主模拟实现LRU Cache 2.2.1、LRU Cache的定义 2.2.2、存放结点 2.2.3、访问结点 2.2.4、LRU Cache 完整模拟代码 小结 前言 这次主要实现一个类似缓存的一种数据结构&#xf…

day49 业务逻辑水平垂直越权访问控制脆弱验证

前言&#xff1a; #知识点&#xff1a; 1、水平越权-同级用户权限共享 2、垂直越权-低高用户权限共享 3、访问控制-验证丢失&取消验证 4、脆弱验证-Cookie&Token&Jwt等 #前置知识&#xff1a; 1、逻辑越权原理- -水平越权&#xff1a;用户信息获取时未对用户…

NTP(Network Time Protocol)协议详解

一、NTP的基本概念&#xff1a; NTP(Network Time Protocol)------网络时间协议-----应用层协议&#xff0c;用来在分布式时间服务器和客户端之间进行时间同步。 二、采用NTP的目的&#xff1a; 是对网络内所有具有时钟的设备进行时钟同步&#xff0c;使网络内所有设备的时钟…

JDY-06蓝牙透传无天线模块介绍

JDY-06蓝牙透传无天线模块简介JDY-06透传模块是基于蓝牙4.0协议标准&#xff0c;工作频段为2.4GHZ范围&#xff0c;调制方式为GFSK&#xff0c;最大发射功率为0db&#xff0c;最大发射距离60米&#xff0c;采用TICC2541芯片设计&#xff0c;支持用户通过AT命令修改设备名、服务…

Alkyne maleimide,Mal-Alkyne,炔烃-马来酰亚胺

中英文别名&#xff1a;CAS号&#xff1a;N/A | 英文名&#xff1a;Alkyne maleimide&#xff0c;Mal-Alkyne |中文名&#xff1a;炔烃-马来酰亚胺物理参数&#xff1a;CASNumber&#xff1a;N/AMolecular formula&#xff1a;C12H14N2O3Molecular weight&#xff1a;234.26Pur…

什么是前后端分离?

当前&#xff0c;数字化发展速度越来越快&#xff0c;前后端分离已经成为今后的发展趋势。在现代化办公管理中&#xff0c;不少企业倾向于使用低代码开发平台实现高效协作办公&#xff0c;那么&#xff0c;什么是前后端分离&#xff1f;都有哪些特点&#xff1f;本文就围绕这个…