13.openssl编程——ASN1库

2023-11-16

13.1  ASN1 简介
ANS.1(Abstract Syntax Notation One, X.208),是一套灵活的标记语言,他允许定义多种数据类型,从integer、bit string、一类的简单类型到结构化类型,如set和sequence,并且可以使用这些类型构建复杂类型。
DER编码是ANS.1定义的将对象描述数据编码成8位串值的编码规则,他给出了对ANS.1值(对象的类型和值)的唯一编码规则。
 
a  简单类型
                     BIT STRING  任意0、1位串;
                     IA5String      任意IA5(ASCII)字符串;
                     INTEGER   任意一个整数;
                     NULL      空值;
                     OBJECT IDENTIFIER 一个对象标识号(一串整数),标识算法或属性类型等对象;
                     OCTET STRING 8位串;
                     PrintableString       任意可打印字符串;
                     T61String       任意T.61(8位)字符串;
                     UTCTime       一个“协同世界时”或“格林威治标准时(G.M.T)”。
b    结构类型
                     结构类型由组件组成,ANS.1定义了四种结构类型:
                     SEQUENCE                  一个或多个类型的有序排列;
                     SEQUENCE OF            一个给定类型的0个或多个有序排列;
                     SET                             一个或多个类型的无序集合;
                     SET OF                     一个给定类型的0个或多个无序集合。
       c    带标记类型
在一个应用内部区分类型的有效方法是使用标记,标记也同样用于区分一个结构类型内部不同的组件。例如SET或SEQUENCE类型可选项通常使用上下文标记以避免混淆。有两种标记类型的方法:隐式和显式。隐式标记类型是将其它类型的标记改变,得到新的类型。隐式标记的关键字是IMPLICIT。显式标记类型是将其它类型加上一个外部标记,得到新的类型。显式标记的关键字是EXPLICIT。
为了进行编码,隐式标记类型除了标记不同以外,可以视为与其基础类型相同。显式标记类型可以视为只有一个组件的结构类型。
      d    其它类型
类型和值用符号::=表示,符号左边的是名字,右边是类型和值。名字又可以用于定义其它的类型和值。
除了CHOICE类型、ANY类型以外,所有ANS.1类型都有一个标记,标记由一个类和一个非负的标记码组成,当且仅当标记码相同时,ANS.1类型是相同的。也就是说,影响其抽象意义的不是ANS.1类型的名字,而是其标记。
 
13.2 DER编码
DER给出了一种将ASN.1值为8位串的方法。DER编码包含三个部分:
标识(一个或多个8位串):定义值的类和标记码,指出是原始编码还是结构化编码
长度(一个或多个8位串):对于定长编码,指出内容中8位串的个数;对于不定长编码
内容(一个或多个8位串):对于原始定长编码,给出真实值,对于结构化编码,给出个串联结果
内容结束(一个或多个8位串):对于结构化不定长编码,标识内容结束,对于其他编码,无此项。
 
13.3 ANS1基本类型示例
a.ANS1_BOOLEAN
表明ASN1语法中的true和flase。
其中0x01 ( 表示为BOOLEAN) 0x01( 表示后面值的长度) 0x00 (值)为本例BOOLEAN DER 编码。
 
b.ANS1_OBJECT
ANS1中OBJECT表明一个对象,每个对象有一个OID(object id)
其中0x06 (表示为OBJECT 类型) 0x03 (值的长度) 0x55 0x04 0x0A
 
c.ASN1_INTEGER
ANS1中的INTEGER类型用于表示整数。
其内容为:0x30 0x03 0x02 (整数) 0x01 (整数值长度)0x55 ( 整数值)
 
d.ASN1_ENUMERATED
 
e. ASN1_BIT_STRING
0x01 0x02的DER编码:0x03(BIT STRING 类型) 0x02(长度) 0x01 0x02(比特值)
 
f.ANS1_OCTET_STRING
0x04(OCTET STRING) 0x02(长度) 0x01 0x02(值)
 
g.ASN1_PRINGTABLESTRING
可打印字符
0x13(PRINTABLESTRING) 0x04(长度) 0x61 0x73 0x6E 0X31(即"asn1")
 
ASN1_UTCTIME:表示时间
ASN1_GENERALIZEDTIME:表示时间
ASN1_VISIBLESTRING:存放可见字符
ASN1_UTF8STRING:用于存放utf8字符串,存放汉子需要将汉子转换utf8字符串
ASN1_TYPE:用于存放任意类型
 
13.4 openssl的ASN.1库
typedef struct asn1_string_st ASN1_INTGER;
ASN1_INTEGER
ASN1_ENUMERATED
ASN1_BIT_STRING
ASN1_OCTET_STRING
ASN1_PRINTABLESTRING
ASN1_T61STRING
ASN1_IAS5STRING
ASN1_UTCTIME
ASN1_GENERALIZEDTIME
ASN1_TIME
ASN1_GENERALSTRING
ASN1_TIME
ASN1_GENERALSTRING
ASN1_UNIVERSALSTRING
ASN1_BMPSTRING
ASN1_VISIBLESTRING
ASN1_UTF8STRING
ASN1_BOOLEAN
ASN1_NULL
 
四种基本的函数
new:用于生成一个新的数据结构
free:用于释放该结构
i2d:用于将该内部数据结构转换成DER编码
d2i:用于将DER编码转换成内部数据结构
 
ASN1_INTEGER_ASN1_INTEGER_new(void);
void *ASN1_INTEGER_free(ASN1_INTEGER *a)
ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **in, long ,len)
int i2d_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **out);
long ASN1_INTEGER_get(ASN1_INTEGER *a)
int ASN1_INTEGER_set(ASN1_INTEGER *a, long v)
 
13.5 用openssl的ASN.1库DER编解码
当采用openssl的ASN.1库编码一个asn.1定义结构的时候,需要采用如下步骤
a.用ASN.1语法定义内部数据结构,并声明函数
所谓内部数据结构,指的是openssl中用基本的数据类型按照ASN.1语法数据结构
以x509v4中正数有效期为例,正数有效期定义如下:
AttCertValidityPeriod::= SEQUENCE
{
notBeforeTime GeneralizedTime,
notAfterTime GenerailizedTime,
}
 
我们定义相应内部数据结构
typedef struct X509V4_VALID_st
{
ASN1_GENERALIZEDTIME *notBefore;
ASN1_GENERALIZEDTIME *notAfter;
} X509V4_VALID;
DECLARE_ASN1_FUNCTIONS(X509V4_VALID)
其中最后一行用于定义四个函数
X509V4_VALID *X509V4_VALID_new(void);
void *X509V4_VALID_free(X509V4_VALID *a);
X509V4_VALID *d2i_ASN1_INTEGER(X509V4_VALID **a, unsgined char **in, long len);
 
b. 实现内部数据结构的四个基本函数
实现内部数据结构的基本函数,是通过一系列的红来实现的。定义的模式如下,定义的模式如下,以属性证书有效期为例,
/*X509V4_VALID*/
ASN1_SEQUENCE(X509V4_VALID) =
{
ASN1_SIMPLE(X509V4_VALID, notBefore, ASN1_GENERALIZEDTIME),
ASN1_SIMPLE(X509V4_VALID, notAfter, ASN1_GENERALIZEDTIME)
} ASN1_SEQUNCE_END(X509V4_VALID)
IMPLEMENT_ASN1_FUNCTIONS(X509V4_VALID)
这样通过宏实现了一个asn.1定义结构的最基本的四个函数
 
13.6 Openssl的ASN.1宏
openssl中ASN.1宏用来定义某种内部数据结构以及这种结构如何编码,部分宏定义说明如下
a.DECLARE_ASN1_FUNCTIONS
用于声明一个内部数据结构的四个基本函数,一般可以在头文件中定义。
b.IMPLEMENT_ASN1_FUNCTIONS
用于实现一个数据结构的四个基本函数
c.ASN1_SEQUENCE
用于SEQUENCE,表明下面的编码是一个SEQUENCE.
d.ASN1_CHOICE
表明下面的编码是选择其中一项,为CHOICE类型
e.ASN1_SIMPLE
用于简单类型或结构类型,并且是必须项。
f.ANS1_OPT
用于可选项,表明asn.1语法中,本项可选的。
g.ANS1_EXP_OPT
用于显示标记,表明asn.1语法中,本项是显示类型,并且是可选的。
h.ASN1_EXP
用于显示标记,表明asn.1语法中,本项是显示标记
i.ASN1_IMP_SEQUENCE_OF_OPT
用于隐示标记,表明asn.1语法中,本项是一个SEQUENCE序列,为隐的。
j.ASN1_IMP_OPT
用于隐示标记,表明asn.1语法中,本想是隐示类型,并且是可选的。
k.ASN1_SEQUENCE_END
用于SEQUENCE结束
l.ASN1_CHOICE_END
用于结束CHOICE类型。
 
13.7 ASN1常用函数
ANS1的基本数据类型如下函数:new, free, i2d, d2i, i2a a2i print set get cmp和dup。
new函数用于分配空间,生成ASN1数据结构
free用于释放空间
i2d函数用于ASN1数据结构转换为DER编码
d2i将DER编码转换为ASN1数据结构
i2a将内部结构转换为ASCII码
a2i将ASCII码转换为内部数据结构
set函数用于设置ASN1类型的值
get函数用于获取ASN1类型值
print将ASN1类型打印
cmp用于比较ASN1数据结构
dup函数进行数据结构的拷贝。
 
常用的函数有:
a.int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num)
功能:计算OID的DER编码
b.int a2i_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *bs, char *buf, int size)
功能:将bp中ASC码转换为ASN1_INTEGER,buf存放BIO中ASC码
c.int a2i_ASN1_STRING(BIO *bp, ASN1_STRING *bs, char *buf, int size)
功能:将ASCII码转换为ASN1_STRING
d.unsigned char *asc2uni(const char *asc, int asclen, usngined char **uni, int *unilen)
功能:将ASCII码转换为unicode
e.int ASN1_BIT_STRING_get_bit(ASN1_BIT_STRING *a, int n)
功能:本函数根据n获取比特位上的值
f.ASN1_BIT_STRING_set
设置ASN1_BIT_STRING的值,他调用ASN1_STRING_set函数
g.void *ASN1_d2i_bio(void *(xnew)(void), d2i_of_void *d2i, BIO *in, void **x)
对bio的数据DER解码,xnew无意义,d2i为DER解码函数,in为bio数据,x为数据类型,返回值为解码后的结果。
h.void *ANS1_d2i_fp(void *(*xnew)(void), d2i_of_void *d2i, FILE *in, void **x)
将in只想的文件进行DER解码,器内部调用了ASN1_d2i_b函数,用法与ASN1_d2i_b类似。
i.int ASN1_i2d_bio(i2d_of_void *i2d, BIO *out, unsigned char *x)
将ASN1数据结构DER编码,并将结果写入bio
j.int ASN1_i2d_fp(i2d_of_void *i2d, d2i_of_void *d2i, char *x)
ASN1数据复制。x为ASN1内部数据结构,本函数先将x通过i2d将他变成DER编码,然后用d2i在DERb编码结果
k.ASN1_ENUMERATED_set
设置ASN1_ENUMERATED的值
l.ASN1_ENUMERATED_get
获取ASN1_ENUMERTED的值。
m.BIGNUM * ANS1_ENUMERATED_to_BN(ASN1_ENUMERATED *ai, BIGNUM *bn)
将ASN1_ENUMERATED类型转换为BN大数类型。此函数调用BN_bin2bn函数获取bn,如果ai->type表明他在调用BN_set_negative设置bn成负数。
n.int ASN1_parse_dump(BIO *bp, const unsigned char *pp, long len; int indent, int dump)
本函数用于将pp和len指明的DER编码值写在BIO中,其中indent和dump用于设置打印的格式。
o.int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_LAGOR *algor2, ANS1_BIT_STRING *data, EVP_PKEY *pkey, const EVP_MD *type)
对ASN1数据类型签名。i2d为ASN1数据的DER方法,signature用于存放签名结果,data为ASN1数据指针,pkey指明签名密钥,type为摘要算法,algor1和algor2无用,可全为NULL.签名时,先将ASN1数据DER编码, 然后摘要,最后签名运算
p.ASN1_STRING *ASN1_STRING_dup(ASN1_STRING *str)
ASN1_STRING类型拷贝。内部申请空间,需要用户调用ASN1_STRING_free释放该空间
q.int ASN1_STRING_cmp(ASN1_STRING *a, ASN1_STRING *b)
ASN1_STRING比较.ossl_typ.h中绝大多数ASN1基本类型都定义 ASN1_STRING,所以,此函数比较通用。
r.unsigned char *ASN1_STRING_data(ASN1_STRING *x)
获取ASN1_STRING数据存放地址,即ASN1_STRING数据结构中data地址。
s.int ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len)
设置ASN1字符串类型的值。str为ASN1_STRING地址,_data为设置值的首地址,len为被设置值的长度。
t.ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid)
根据nid来查找ASN1_STRING_TABLE表。此函数先查找标准表tbl_standard,再查找扩展表stable。
u.ASN1_STRING *ASN1-STRING_set_by_NID(ASN1_STRING **out, const unsigned char *in , int inlen, int inform, int nid)
根据nid和输入值获取对应的ASN1_STIRNG类型
static const ASN1_STRING_TABLE tbl_standard[] = {
{NID_commonName, 1, ub_common_name, DIRSTRING_TYPE, 0},
{NID_countryName, 2, 2, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_localityName, 1, ub_locality_name, DIRSTRING_TYPE, 0},
{NID_stateOrProvinceName, 1, ub_state_name, DIRSTRING_TYPE, 0},
{NID_organizationName, 1, ub_organization_name, DIRSTRING_TYPE, 0},
{NID_organizationalUnitName, 1, ub_organization_unit_name, DIRSTRING_TYPE,
0},
{NID_pkcs9_emailAddress, 1, ub_email_address, B_ASN1_IA5STRING,
STABLE_NO_MASK},
{NID_pkcs9_unstructuredName, 1, -1, PKCS9STRING_TYPE, 0},
{NID_pkcs9_challengePassword, 1, -1, PKCS9STRING_TYPE, 0},
{NID_pkcs9_unstructuredAddress, 1, -1, DIRSTRING_TYPE, 0},
{NID_givenName, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_surname, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_initials, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_serialNumber, 1, ub_serial_number, B_ASN1_PRINTABLESTRING,
STABLE_NO_MASK},
{NID_friendlyName, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK},
{NID_name, 1, ub_name, DIRSTRING_TYPE, 0},
{NID_dnQualifier, -1, -1, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_domainComponent, 1, -1, B_ASN1_IA5STRING, STABLE_NO_MASK},
{NID_ms_csp_name, -1, -1, B_ASN1_BMPSTRING, STABLE_NO_MASK},
{NID_rfc822Mailbox, 1, ub_rfc822_mailbox, B_ASN1_IA5STRING,
STABLE_NO_MASK},
{NID_jurisdictionCountryName, 2, 2, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_INN, 1, 12, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_OGRN, 1, 13, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_SNILS, 1, 11, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_countryCode3c, 3, 3, B_ASN1_PRINTABLESTRING, STABLE_NO_MASK},
{NID_countryCode3n, 3, 3, B_ASN1_NUMERICSTRING, STABLE_NO_MASK},
{NID_dnsName, 0, -1, B_ASN1_UTF8STRING, STABLE_NO_MASK}
};
v.void ASN1_STRING_set_default_mask(unsigned long mask)
设置ASN1_STRING_set_by_NID函数返回的ASN1_STRING类型。
w.int ASN1_STRING_set_defualt_mask_asc(char *p)
设置ASN1_STRING_set_by_NID函数返回ASN1_STRING类型。字符串p可以的值由:nombstr, pkix\utf8only和defualt
x.int ASN1_STRING_TABLE_add(int nid, long minsize, long maxsize, usngiend long mask, unsigned long flags)
添加扩展ASN1_STRING_TABLE项
y.void ASN1_STRING_TABLE_cleanup(void)
清除用户自建的扩展ASN1_STRING_TBALE表
z.int i2a_ASN1_INTEGER(BIO *bp, ASN1_INTEGER *a)
将整数转换为ASCII码,放在BIO中。
 
a1.int i2a_ASN1_STRING(BIO *bp, ASN1_STRING *a, int type)
type不起作用,将ASN1_STRING转换为ASCII码
b1.OBJ_bsearch
用于从排序好的数据结构地址数组中用二分法查找数据。
c1.OBJ_create
根据oid以及名称信息生成一个你不的object
d1.OBJ_NAME_add
OBJ_NAME_cleanup
OBJ_NAME_get
OBJ_NAME_init
OBJ_NAME_remove
OBJ_NAME_new_index
OBJ_NAME_do_all
OBJ_NAME_do_all_sorted
OBJ_NAME函数用于根据名字获取对称算法或者摘要算法。
e1. int OBJ_new_nid(int num)
此函数将内部的new_nid加num,返回原nid
f1.const char *OBJ_nid2ln(int n)
根据nide得到对象的描述
g1.OBJ_nid2obj
根据nid得到对象
h1.const char *OBJ_nid2sn(int n)
根据nid得到的对象的sn(简称)
i1.OBJ_nid2obj
根据nid得到对象
j1.const char *OBJ_nid2sn(int n)
根据nid得到对象
k1.int OBJ_obj2nid(const ASN1_OBJECT *a)
根据对象获取其nid;
l1 int OBJ_obj2nid(const ASN1_OBJECT *a)
根据对象获取器nid;
m1 OBJ_obj2txt
根据对象获取对象说明或者nid
n1.OBJ_txt2obj
根据sn或者ln得到的对象
 
13.8 属性证书编码
对属性证书(x509v4)编码
typedef struct X509V4_VALID_st
{
ASN1_GENERALIZEDTIME *notBefor;
ASN1_GENERALIZEDTIME *notAfer;
}X509V4_VALID;
DECLARE_ASN1_FUNCTIONS(X509V4_VALID)
 
typedef struct ISSUERSERIAL_st
{
GENERAL_NBAMES *issuer;
ASN1_INTEGER *subjectSN;
ASN1_BIT_STRING *issuerUID;
} ISSUERSERIAL;
DECLARE_ASN1_FUNCTIONS(ISSUERSERIAL)
 
typedef struct OBJDIGEST_st
{
ASN1_ENUMERATE *digestType;
ASN1_OBJECT *otherType;
X509_ALGOR *digestAlg;
ASN1_BIT_STRING *digestBit;
} OBJDIGEST;
DECLARE_ASN1_FUNCTIONS(OBJDIGEST)
 
typedef struct ACHOLDER_st
{
ISSUERSERIAL *baseCertificateID;
GENERAL_NAMES *entiyName
OBJDIGEST *objDigest;
}ACHOLDER;
DECLARE_ASN1_FUNCTIONS(ACHOLDER)
 
typedef struct V2FORM_st
{
GENERAL_NAMES *entiyName;
issuerserial *baseCertificateID;
OBJDIGEST *objDigest;
}V2FORM;
DECLARE_ASN1_FUNCTIONS(V2FORM)
 
typedef struct ACISSUER_st
{
int type;
union
{
V2FORM *v2Form;
}form;
} ACISSUER;
DECLARE_ASN1_FUNCTIONS(ACISSUER)
 
 
ASN1_SEQUENCE(ISSUERSERIAL) = {
asn1_simple(issuerserial, ISSUER, GENERAL_NAMES),
ASN1_SIMPLE(ISSUERSERIAL, subjectSN, ASN1_INTEGER)
ASN1_OPT(ISSUERSERIAL, isserUID, ASN1_BIT_STIRNG)
}ASN1_SEQUENCE_END(ISSUERSERIAL)
IMPLEMENT_ASN1_FUNCTIONS(ISSUERSERIAL)
 
ASN1_SEQUENCE(OBJDIGEST) = {
ASN1_SIMPLE(OBJDIGEST, digestType, ASN1_ENUMERATED),
ASN1_OPT(OBJDIGEST, otherType, ASN1_OBJECT),
ASN1_SIMPLE(OBJDIGEST, digestAlg, X509_ALGOR)
ASN1_SIMPLE(OBJDIGEST, digestBit, ASN1_BIT_STRING)
} ASN1_SEQUENEC_END(OBJDIGEST)
IMPLEMENT_ASN1_FUNCTIONS(OBJDIGEST)
 
ASN1_SEQUENCE(X509V4_ALID) = {
ASN1_SIMPLE(X509V4_VALID, notBefore, ASN1_GENERALIZEDTIME)
ASN1_SIMPLE(X509V4_VALID, notAfer, ASN1_GENERALIZEDTIME)
}IMPLEMENT_ASN1_FUNCTIONS(X509V4_VALID)\
 
ASN1_SEQUENCE(X5409V4_CINF) = {
ASN1_SIMPLE(X509V4_CINF, version, ASN1_INTEGER)
ASN1_SIMPLE(X509V4_CINF, holder, ACHOLDER)
ASN1_SIMPLE(X509V4_CINF, issuer, ACISSUER)
ASN1_SIMPLE(X509V4_CINF, signature, ACISSUER)
ASN1_SIMPLE(X509V4_CINF, serialNumber, ASN1_INTEGER)
ASN1_SIMPLE(X509V4_CINF, X509V4_VALID)
ASN1_SIMPLE(X509V4_CINF,attributes, X509_ATTRIBUTE)
ASN1_SIMPLE(X509V4_CINF, issuerUID, ASN1_BIT_STRING)
ASN1_SIMPLE(X509V4_CINF, EXTENSIONS, x509_extension
}ASN1_SEQUENCE_END(X509V4_CINF)
IMPLEMENT_ASN1_FUNCTIONS(X509V4_CINF)
 
ASN1_SEQUENCE(X509V4) = {
ASN1_SIMPLE(X509V4, cert_info, X509V4_CINF)
ASN1_SIMPLE(X509V4, sig_alg, X509_ALGOR)
ASN1_SIMPLE(X509V4, signature, ASN1_BIT_STRING)
}ASN1_SEQUENCE_END(X5509V4)
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

13.openssl编程——ASN1库 的相关文章

  • 桶排序 (详细图解)

    一 桶排序 桶排序 Bucket sort 或所谓的箱排序 是一个排序算法 工作的原理是将数组分到有限数量的桶里 每个桶再个别排序 有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序 最后依次把各个桶中的记录列出来记得到有序序列
  • 攻防世界web之ics-06

    打开网址 四处点击 点到报表中心 跳转新页面 查看源码也没有什么特别的 发现URL栏有 id 1 以为是sql注入 但是并不是 查看大佬的wp 发现这题采用brupsuite爆破 先将抓到的包放到Intruder 然后将id设为变量 然后把
  • WEB自动化测试面试题及答案大全

    1 Selenium是否支持桌面应用软件的自动化测试 Selenium不支持桌面软件的自动化测试 Selenium是根据网页元素的属性才定位元素 而其他桌面软件自动化测试工具是根据桌面元素的位置来定位元素 当然现在也有根据桌面元素的属性来定
  • type_traits

    概述 type traits提供了丰富的编译期间计算 查询 判断 转换和选择的帮助类 其被定义在 include
  • React-50:setState

    对象形式 也是最经常用到的 import React Component from react export default class Demo extends Component state count 0 add gt 对象式的set
  • 计算机网络学习笔记四、http和https

    http和https 从本篇文章开始总结http协议相关的知识点 http协议相关的内容可以分为四个部分 HTTP报文 HTTP请求 HTTP发展历史 HTTPS 1 HTTP报文 HTTP全称Hyper Text Transfer Pro
  • 数据库连接出错?

    数据库连接为什么会出错呢 NO suitable driver found for jdbc 问题源有3 1 连接的url的格式有错 Connection conn DriverManager getConnection jdbc sqls
  • 30个 JS 实用技巧总结,助你提升工作效率

    英文 https javascript plainenglish io 35 javascript short hands coding methodologies 28ea2d7d0a5e 翻译 杨小二 我是Rakshit Shah 我在
  • 【Java】JDK 1.8新特性

    Lambda 表达式 在没有 Lambda 表达式的时候 在 Java 中只能使用匿名内部类代替 Lambda 表达式 以下面的代码为例 查看 Lambda 表达式的使用 匿名内部类方式排序 List
  • c语言输入输出函数printf与scanf的用法格式

    c语言输入输出函数printf与scanf的用法格式 格式化规则例如 5 4f等类似问题的说明 Turbo C2 0 标准库提供了两个控制台格式化输入 输出函数printf 和scanf 这两个函数可以在标准输入输出设备上以各种不同的格式读
  • SAP LSMW日志信息如何导出到Excel里?

    SAP LSMW日志信息如何导出到Excel里 在SAP系统中 数据迁移LSMW运行的日志 是可以下载到本地Excel文件里的 方式如下所示 双击某个会话 点击打印机图标 就可以导出到Excel文件里了 输入文件名 指定文件保存的目录 完
  • 送书

    今天是周三 又到了给大家送书的时刻啦 这次给大家带来的是 OpenCV图像处理入门与实践 文末查看送书规则 简介 OpenCV 是一个开源的计算机视觉库 可以实现计算机视觉算法 本书从 OpenCV 用 Python 实现的基础语法讲起 逐
  • C51定时器和计数器 timer and counter

    代码 include
  • Seven Different Linux/BSD Firewalls Reviewed

    Seven Different Linux BSD Firewalls Reviewed Firewall November 14th 2007 Did you know more than 500 million computers in
  • 鲸鱼优化算法论文【matlab代码与仿真】

    一 算法流程 通过回声定位并相互传递探寻猎物信息 研究表明 鲸鱼大脑的某些区域与人类相似 有一种叫做梭形细胞的共同细胞 这些细胞负责人类的判断 情感和社会行为 这种细胞的数量是成年人的两倍 事实证明 鲸鱼可以像人类一样思考 学习 判断 交流
  • 从Kubernetes 1.14 发布,看技术社区演进方向

    Kubernetes 1 14 正式发布已经过去了一段时间 相信你已经从不同渠道看过了各种版本的解读 不过 相比于代码 Release 马上就要迎来5周岁生日的Kubernetes 项目接下来如何演进 其实也是一个让人着迷的话题 而作为一个
  • 在linux中,&和&&,

    对应刚接触linux命令的小伙伴们来说 这些符号一定是很困扰的下面我们一起来看这些符号区别和用法 表示任务在后台执行 如要在后台运行 如 root localhost local java jar test jar gt log txt 运
  • 大型 SaaS 平台产品架构设计

    当我们去搜索 架构 可以得到很多的架构图片 比如组织架构 业务架构 数据架构 技术架构 安全架构 产品架构 部署架构等 什么是架构 通常大家说架构一般指软件架构 架构是指软件的基础结构 创造这些基础结构的准则 以及对这些结构的描述 在这个定
  • IAR常见报错

    右键进入函数出错 project gt clean
  • 利用python进行数据分析之数据聚合和分组运算--小白笔记

    GroupBy机制 split apply combine 拆分 应用 合并 import pandas as pd import numpy as np df pd DataFrame key1 a a b b a key2 one tw

随机推荐

  • 找不到匹配的host key算法

    vim etc ssh sshd config
  • 《WebRTC系列》实战 Web 端支持 h265 硬解

    1 背景 Web 端实时预览 H 265 需求一直存在 但由于之前 Chrome 本身不支持 H 265 硬解 软解性能消耗大 仅能支持一路播放 该需求被搁置 去年 9 月份 Chrome 发布 M106 版本 默认开启 H 265 硬解
  • raw格式详解

    raw格式是camera sensor直接输出的格式 每个像素点表示一个颜色分量B G或R 注意 这句话不准确 红外相机的sensor和彩色相机的sensor有些不同 有的红外相机的sensor输出的raw data就是亮度值 即灰度值 输
  • Android Flutter开发环境搭建

    1 搭建 Flutter 开发环境 本栏亦在快速上手Android Flutter Flutter框架就不介绍了 框架这个东西怎么说呢 对于大部分人来说只是了解即可 如需了解的话 可以度娘资料很多 本节我们主要看下如何在Windwos下搭建
  • Kotlin协程实现原理:CoroutineScope,看完不懂你砍我!墙裂建议收藏。

    今天我们来聊聊Kotlin的协程Coroutine 文末有为大家准备的彩蛋 如果你还没有接触过协程 推荐你先阅读这篇入门级文章What 你还不知道Kotlin Coroutine 如果你已经接触过协程 相信你都有过以下几个疑问 协程到底是个
  • 一个码稿人自述:什么样的文档产品适合我?|深度吐槽

    关注ITValue 看企业级最新鲜 最价值报道 图片来源 Unsplash 钛媒体打工人 媒体相关从业经验4 5年 文档使用重度患者 今天以我曾经用过的 和现在主流的一些文档产品为例 来谈谈我的使用体验 以及什么样的文档适合我 一 我与文档
  • [编程工具]MarkDown编辑查看以及使用语法

    目录 0 前言 1 markDown语法 2 markDown 3 MD正确打开方式 4 结尾 结束啦感谢观看 5 参考连接 0 前言 本文介绍了markDown的编辑查看 使用浏览器查看以及Vscode中查看编辑MD 最后介绍了MD的常用
  • python解析佳明fit文件

    使用 fitparse 解析 佳明 fit 文件 以下示例测试环境为 python 3 8 fitparse 1 2 fitparse 安装 pip3 install fitparse 使用方式 import fitparse from d
  • 蓝牙通讯

    蓝牙通讯 简介 蓝牙API 所需权限 使用蓝牙的步骤 普通调用案例 通讯案例 简介 蓝牙 是一种支持设备短距离通信 一般10m内 且无阻隔媒介 的无线电技术 能在包括移动电话 PDA 无线耳机 笔记本电脑等众多设备之间进行无线信息交换 利用
  • 数据库创建索引和删除索引的方式总结

    一 创建索引 1 1 使用Alter创建索引 1 添加主键索引 特点 数据列不允许重复 不能为null 一张表只能有一个主键 Mysql主动将该字段进行排序 ALTER TABLE 表名 ADD Primary key col 2 添加唯一
  • MySQL安装与启动

    1 MySQL安装包下载 下载地址 https dev mysql com downloads mysql 这里我的电脑是WIN764位的 大家根据自己的电脑自己选择要下载的包 2 解压安装 解压后进入到Windows的DOS命令行下 切换
  • python股票量化交易系统_利用python建立股票量化交易系统(一)

    从今天开始正式开启我的博客之旅 博客内容全部是我自己的量化心得 主要还是为自己将来中工作之中遇到相似问题 可以方便的找到答案 如果能帮到有相似问题的其他同学 我也很开心 如果帮不到的话 不喜勿喷 如果文章中有什么不对的地方 欢迎批评指正 建
  • VI编辑器的使用常用快捷方式编辑命令

    VI编辑器的使用常用快捷方式编辑命令 一 VI编辑器的工作模式 1 VI编辑器有以下三种工作模式 命令模式 输入模式 末行模式 2 不同模式之间的切换 外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img 7BrI0o
  • 【LInux】基础开发工具的使用

    文章目录 一 Linux的应用市场 yum 1 什么是yum 2 为什么要有yum 3 如何使用yum 3 1 前提条件 3 2 搜索软件 3 3 安装软件 3 4 卸载软件 二 Linux的文本编辑器 vim 1 什么是vim 2 为什么
  • Java中的线程

    一 程序 进程 线程之间的关系 程序 进程和线程是计算机中重要的概念 它们描述了不同层次上的执行和管理方式 程序是指由一系列指令组成的代码文件 它定义了算法和逻辑 用来解决特定的问题 程序本身是静态的 只有在被加载到内存并被操作系统调度执行
  • SSM框架(Spring+SpringMVC+MyBatis)

    SSM Spring SpringMVC MyBatis 框架集由Spring SpringMVC MyBatis三个开源框架整合而成 常作为数据源较简单的web项目的框架 Spring是一个开源框架 Spring是于2003 年兴起的一个
  • 思科CISCO常用命令汇总

    视图模式介绍 1 普通视图router gt 2 特权视图router 在普通模式下输入enable 3 全局视图router config 在特权模式下输入configt 4 接口视图router config if 在全局模式下输入in
  • ASN.1的一些理解

    为什么要有ASN 1这个东西 我们知道 像C Java这种高级语言 对于计算机来说都要转化为二进制代码才能识别和操作 这就涉及到序列化和反序列化这两个概念 将一个对象序列化成二进制代码 就可以保存成文本或者利用网络传输到远程 与序列化相对的
  • 2021-02-23(亚马逊服务存储桶)

    亚马逊云服务器测试情况 需要外网 国际 才能登录 网址 https 956438185477 signin aws amazon com console 国际短信的话 在右上角区域区域选择弗吉尼亚北部 左边选择sms短信服务 视频加速要用到
  • 13.openssl编程——ASN1库

    13 1 ASN1 简介 ANS 1 Abstract Syntax Notation One X 208 是一套灵活的标记语言 他允许定义多种数据类型 从integer bit string 一类的简单类型到结构化类型 如set和sequ