• Tools
  • mysql报错:1044 -Access denied for user ‘用户名‘@‘%‘ to database
    远程连接工具可以成功连接数据库,但是只会显示information_schema这个自动生成的数据库,其他的数据库无法显示来 解决方法本地连接root,找到mysql数据库,修改user表中需要连接的用户名数据找到Grant_priv,和Super_priv两个字段,将值改为Yflushprivileges(见下方注释)重启mysql注释解析flushprivilegesflush privileges 命令本质上的作用是将当前user和privilige表中的用户信息/权限设置从mysql库(MySQL数据库的内置库)中提取到内存里。MySQL用户数据和权限有修改后,希望在”不重启MySQL服务”的情况下直接生效,那么就需要执行这个命令。通常是在修改ROOT帐号的设置后,怕重启后无法再登录进来,那么直接flush之后就可以看权限设置是否生效。而不必冒太大风险。
  • css去掉相邻的线(双线)
    在表格的样式中添加border-collapse: collapse;以设置边框合并(如果border-collapse的属性值为collapse,则会忽略border-spacing和empty-cells属性border-collapse 设置表格的边框是否被合并为一个单一的边框,还是像在标准的HTML中那样分开显示。值说明collapse如果可能,边框会合并为一个单一的边框。会忽略border-spacing和empty-cells属性separate默认值。边框会被分开。不会忽略border-spacing和empty-cells属性inherit规定应该从父元素继承border-collapse属性的值
  • hashchange介绍
    hashchange事件是html5新增的api,用来监听浏览器链接的hash值变化。目前流行的spa框架的路由都有使用到该特性,接下来简单介绍下:当URL的片段标识符更改时,将触发hashchange事件(跟在#符号后面的URL部分,包括#符号)属性类型描述targetEventTarget上下文为window对象typeDOMStringevent类型bubblesBoolean事件是否能冒泡cancelableBoolean事件是否能被取消oldURLString跳转前的URLnewURLString跳转后的当前URLhashchange跳转到对应的锚点示例应用:https://mackhly.hlytools.top/article/54.html
  • 点击a标签滑动到对应的锚点位置
    /** 目录跳转锚点功能* */window.addEventListener('hashchange', function (e) {    let hash=location.hash    let sub=hash.substr(1)    let top=$(`a[name=${sub}]`).offset().top    $(window).scrollTop(top-50)}, false)//可使用location.hast获取锚点
  • js对象的key使用变量代替
    普通的对象类型数据中直接用变量名填写key最后key会变成变成变量名的字符串let key="key1"let obj={    key:"1"}console.log(obj)//{key:1}//使用一个变量代替keylet key="key1"let obj={    [key]:"1"}console.log(obj)//{key1:1}
  • php判断是http还是https
    /** * php判断是http还是https */function is_https(){    if (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {        return true;    }    if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {        return true;    }    if (!empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {        return true;    }    return false;}
  • JSON基本使用
    文章目录1.JSON是什么?2.JSON的语法规则是怎样的?3.JSON和XML4.JSON的解析和生成(JSON和JS对象互转)5.JSON格式规定6.字符串转化成对象7.JS对象转化为字符串1.JSON是什么?JSON,全称是JavaScriptObjectNotation,即JavaScript对象标记法。JSON是一种轻量级(Light-Meight)、基于文本的(Text-Based)、可读的(Human-Readable)格式。JSON的名称中虽然带有JavaScript,但这是指其语法规则是参考JavaScript对象的,而不是指只能用于JavaScript语言。JSON无论对于人,还是对于机器来说,都是十分便于阅读和书写的,而且相比XML(另一种常见的数据交换格式),文件更小,因此迅速成为网络上十分流行的交换格式。近年来JavaScript已经成为浏览器上事实上的标准语言,JavaScript的风靡,与JSON的流行也有密切的关系。因为JSON本身就是参考JavaScript对象的规则定义的,其语法与JavaScript定义对象的语法几乎完全相同。JSON格式的创始人声称此格式永远不升级,这就表示这种格式具有长时间的稳定性,10年前写的文件,10年后也能用,没有任何兼容性问题。2.JSON的语法规则是怎样的?JSON的语法规则十分简单,可称得上“优雅完美”,总结起来有:数组(Array)用方括号(“[]”)表示。对象(0bject)用大括号(“{}”)表示。名称/值对(name/value)组合成数组和对象。名称(name)置于双引号中,值(value)有字符串、数值、布尔值、null、对象和数组。并列的数据之间用逗号(“,”)分隔{"name": "xdr630","favorite": "programming"}12343.JSON和XMLJSON常被拿来与XML做比较,因为JSON的诞生本来就多多少少要有取代XNL的意思。相比XML,JSON的优势如下:没有结束标签,长度更短,读写更快能够直接被JavaScript解释器解析可以使用数组两者比较JSON:{"name":"兮动人","age":22,"fruits":["apple","pear","grape"]}12345XML:兮动人22applepeargrape12345674.JSON的解析和生成(JSON和JS对象互转)在JavaScript中,有两个方法与此相关:JSON.parse和JSON.stringify。JSON和JS对象互转要实现从JSON字符串转换为JS对象,使用JSON.parse()方法:var str = '{"name": "兮动人","age":22}';var obj = JSON.parse(str);console.log(obj);12345要实现从JS对象转换为JSON字符串,使用JSON.stringify()方法:var str = '{"name": "兮动人","age":22}';var obj = JSON.parse(str);console.log(obj);        var jsonstr = JSON.stringify(obj);console.log(jsonstr);123456785.JSON格式规定1、对象(0bject)对象用大括号(“{}”)括起来,大括号里是一系列的“名称/值对”,请看概念图。两个并列的数据之间用逗号(“,”)隔开,注意两点:使用英文的逗号(“,”),不要用中文的逗号(“,”)最后一个“名称/值对“之后不要加逗号JSON在线检查语法:https://www.json.cn/这里报错说明JSON中Key/Value不能使用单引号正确写法2、数组(Array)数组表示一系列有序的值,用方括号(“[]”)包围起来,并列的值之间用逗号分隔,请看概念图。例如,以下的数组是合法的:[1,2,"three","four",true,false,null,[1,2],{"name":"兮动人"}]13、名称/值对(Name/Value)名称(Name)是一个字符串,要用双引号括起来,不能用单引号,也不能没有引号,这一点与JavaScript不同。值的类型只有七种:字符串(string)、数值(number)、对象(object)、数组(array),true、false、null。不能有这之外的类型,例如undefined、函数等。请看概念图。字符串(string)的规则如下:英文双引号括起来,不能用单引号,也不能没有。字符串中不能单独出现双引号(”)和右斜杠(“\")。如果要打双引号或右斜杠,需要使用“右斜杠+字符”的形式,例如\”和\\,其它的转义字符也是如此字符串的概念图。转义字符{"string":"\\ \" "}123数值类型,可以使用科学计数法表示{"number":1e3,"n1":1e2,"n2":-100}123456.字符串转化成对象解析:是指将符合JSON语法规则的字符串转换成对象的过程。不同的编程语言都提供了解析JSON字符串的方法,在这里主要讲解JavaScript中的解析方法。主要有三种:使用eval()使用JSON.parse()使用第三方库,例如JQuery等1、eval()eval()函数的参数是一个字符串,其作用是直接执行其中的JavaScript代码。案例:eval()解析字符串var str = "console.log('hello')";eval(str);1234eval解析字符串的结果:eval()能够解析JSON字符串。从这里也可以看得出,JSON和JavaScript是高度嵌合的。案例:eval()解析JSON字符串var str = '{"name":"兮动人","age":22}';var obj = eval("("+str+")");console.log(obj)12345但是,现在已经很少直接使用eval()来解析了,如果您的浏览器版本真的是很旧,可能才需要这个方法。此外,eval()是一个相对危险的函数,因为字符串中可能含有未知因素。在这里,作为学习,还是要知道这也是一种方法。请注意eval()的参数,在字符串两旁加了括号,这是必须的,否则会报错。因为JSON字符串是被大括号(“{}”)包围的,直接放到eval()会被当成语句块来执行,因此要在两旁加上括号,使其变成表达式。2、JSON.parse()现在绝大多数浏览器都以支持JSON.parse(),是推荐使用的方式。如果输入了不符合规范的字符串,会报错。案例:JSON字符串转换为JS对象var str = '{"name":"兮动人","age":22}';var obj = JSON.parse(str)console.log(obj)12345JSON.parse()可以有第二个参数,是一个函数。此函数有两个参数:name和value,分别代表名称和值。当传入一个JSON字符串后,JSON的每一组名称/值对都要调用此函数。该函数有返回值,返回值将赋值给当前的名称(name)。利用第二个参数,可以在解析JSON字符串的同时对数据进行一些处理。案例:var str = '{"name":"兮动人","age":22}';var obj = JSON.parse(str,fun);function fun(name,value){console.log(name+":"+value);return value}console.log(obj)123456789可以做判断处理,当JSON字符串的name=age时,设置age的value=14var str = '{"name":"兮动人","age":22}';var obj = JSON.parse(str,fun);function fun(name,value){if (name == "age")value = 14;return value} console.log(obj)123456789107.JS对象转化为字符串序列化,指将JavaScript值转化为JSON字符串的过程。JSON.stringify()能够将JavaScript值转换成JSON字符串。JSON.stringify()生成的字符串可以用JSON.parse()再还原成JavaScript值。1、参数的含义JSON.stringify(value[, replacer[, space]])1value:必选参数。被变换的JavaScript值,一般是对象或数组。replace:可以省略。有两种选择:函数或数组。如果是函数,则每一组名称/值对都会调用此函数,该函数返回一个值,作为名称的值变换到结果字符串中,如果返回undefined,则该成员被忽略。案例:        var obj = {            name: "兮动人",            age: 22        };        console.log(obj);        var jsonstr = JSON.stringify(obj,fun);        function fun(name,value) {            if (name=="age")                value = 18;                return value;         }        console.log(jsonstr)123456789101112131415161718如果是数组,则只有数组中存在名称才能够被转换,且转换后顺序与数组中的值保持一致。案例:        var obj = {            a: 1,            b: 2,            c: 3,            d: 4        };        console.log(obj);        var jsonstr = JSON.stringify(obj,["a","b","c"]);                console.log(jsonstr)12345678910111213把顺序改下,对应转换的JSON字符串的数值不变var jsonstr = JSON.stringify(obj,["c","a","b"]);1space:可以省略。这是为了排版、方便阅读而存在的。可以在JSON字符串中添加空白或制表符等。2、value的用法var obj = {            name: "兮动人",            age: 22        }console.log(obj);var jsonstr = JSON.stringify(obj);console.log(jsonstr)123456789当有不符合JSON语法规则时,就不会被转换成JSON字符串。数组中有函数时会被转换成nullvar obj = {            name: "兮动人",            age: 22,            a: undefined,            f: function () {            },            b:[function () {}]        }console.log(obj);var jsonstr = JSON.stringify(obj);console.log(jsonstr)        12345678910111213143、replace的用法4、space的用法案例:在上面的基础上添加        var obj = {            a: 1,            b: 2,            c: 3,            d: 4        };        console.log(obj);        var jsonstr = JSON.stringify(obj,["c","a","b"],"one");        console.log(jsonstr)12345678910111213改成制表符:\t        var obj = {            a: 1,            b: 2,            c: 3,            d: 4        };        console.log(obj);        var jsonstr = JSON.stringify(obj,["c","a","b"],"\t");        console.log(jsonstr)12345678910111213
  • git restore --staged撤销你在暂存区的提交
    我们通过gitadd命令将文件提交到暂存区之后,发现文件提交错了,就可以通过gitrestore--staged撤销在暂存区提交的文件。通过实例演示一下当前目录下有三个文件进行了修改,并提交到了暂存区。通过gitls-files命令可以查看暂存区的文件$ lsREADME.md  a.txt  main.cpp lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)$ git add .warning: LF will be replaced by CRLF in a.txt.The file will have its original line endings in your working directory lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)$ git ls-filesREADME.mda.txtmain.cpp lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)$ git statusOn branch masterYour branch is up to date with 'origin/master'. Changes to be committed:  (use "git restore --staged ..." to unstage)        modified:   README.md        new file:   a.txt        modified:   main.cpp  lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)我们撤回暂存区的a.txt文件lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)$ git restore --staged a.txt lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)$ git ls-filesREADME.mdmain.cpp lng@DESKTOP-9TD21KL MINGW64 ~/Desktop/新建文件夹/test001/test001 (master)$ git statusOn branch masterYour branch is up to date with 'origin/master'. Changes to be committed:  (use "git restore --staged ..." to unstage)        modified:   README.md        modified:   main.cpp Untracked files:  (use "git add ..." to include in what will be committed)        a.txt可以看到暂存区没有a.txt文件了,查看状态可以看到,a.txt文件的状态变成了未跟踪状态。
  • mysql索引的基本使用
    文章目录1.索引的声明与使用1.4.1使用ALTERTABLE语句创建索引1.4.2使用CREATEINDEXON语句创建索引1.2.1创建表的时候创建索引(隐式)1.2.2在已经存在的表上创建索引(显式)1、创建普通索引2、创建唯一索引3、主键索引4、创建单列索引5、创建联合索引6、创建全文索引7、创建空间索引1.1索引的分类1.2创建索引1.3删除索引1.4在已经存在的表上创建索引2.隐藏索引1.索引的声明与使用1.1索引的分类MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。从功能逻辑上说,索引主要有4种,分别是普通索引、唯一索引、主键索引、全文索引。按照物理实现方式,索引可以分为2种:聚簇索引和非聚簇索引.按照作用字段个数进行划分,分成单列索引和联合索引。1、普通索引在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引|可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表student的字段name.上建立一个普通索引,查询记录时就可以根据该索引进行查询。2、唯一性索引使用UNIQUE参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。例如,在表student的字段email中创建唯一性索引,那么字段email的值就必须是唯一的。通过唯一-性索引,可以更快速地确定某条记录。3、主键索引主键索引就是一种特殊的唯一性索引,在唯一索弓的基础,上增加了不为空的约束,也就是NOT NULL+UNIQUE1一张表里最多只有一个主键索引。这是由主键索引的物理实现方式决定的,因为数据存储在文件中只能按照一种顺序进行存储。4、单列索引在表中的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索弓|只对应一个字段即可。一个表可以有多个单列索引。5、多列(组合、联合)索引多列索引是在表的多个字段组合,上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段中的第一个字段时才会被使用。例如,在表中的字段id、name和gender上建立一个多列索引idx_id_name_gender,只有在查询条件中使用了字段id时该索引才会被使用。使用组合索引时遵循最左前缀集合。6、全文索引全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用[分词技术]等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。使用参数FULLTEXT可以设置索弓为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引|列中插入重复值和空值。全文索引只能创建在CHAR、VARCHAR或TEXT类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,表student的字段information是TEXT类型,该字段包含了很多文字信息。在字段information.。上建立全文索引|后,可以提高查询字段information的速度。全文索弓|典型的有两种类型:自然语言的全文索引和布尔全文索引。自然语言搜索弓|擎将计算每一个文档对象和查询的相关度。这里,相关度是基于匹配的关键词的个数,以及关键词在文档中出现的次数。在整个索引中出现次数越少的词语,匹配时的相关度就越高。相反,非常常见的单词将不会被搜索,如果一个词语的在超过50%的记录中都出现了,那么自然语言的搜索将不会搜索这类词语。MySQL数据库从3.23.23版开始支持全文索引,但MySQL5.6.4I以前只有Myisam支持,5.6.4版本以后innodb才支持,但是官方版本不支持中文分词,需要第三方分词插件。在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词。测试或使用全文索引时,要先看-下自己的MySQL版本、存储弓|擎和数据类型是否支持全文索引。随着大数据时代的到来,关系型数据库应对全文索弓的需求已力不从心,逐渐被solr、ElasticSearch等专门的搜索弓|擎所替代。7、空间索引使用参数SPATIAL可以设置索引为空间索引。空间索引只能建立在空间数据类型上,这样可以提高系统获取空间数据的效率。MySQL中的空间数据类型包括GEOMETRY、POINT、LINESTRING和POLYGON等。目前只有MyISAM存储引擎支持空间检索,而且索引的字段不能为空值。对于初学者来说,这类索引很少会用到。小结:不同的存储引擎支持的索引类型也不一样InnoDB:支持B-tree、Full-text等索引,不支持Hash索引;MyISAM:支持B-tree、Full-text等索引,不支持Hash索引;Memory:支持B-tree、Hash等索引,不支持Full-text索引;NDB:支持Hash索引,不支持B-tree、Full-text等索引;Archive:不支持B-tree、Hash、Full-text等索引;1.2创建索引1.2.1创建表的时候创建索引(隐式)隐式的方式创建索引。在声明有主键约束、唯一性约束、外键约束的字段上,会自动的添加相关的索引MySQL支持多种方法在单个或多个列上创建索引:在创建表的定义语句CREATETABLE中指定索引列,使用ALTERTABLE语句在存在的表上创建索引,或者使用CREATEINDEX语句在已存在的表上添加索引。创建表的时候创建索引使用CREATETABLE创建表时,除了可以定义列的数据类型外,还可以定义主键约束、外键约束或者唯一性约束,而不论创建哪种约束,在定义约束的同时相当于在指定列上创建了一个索引。举例:CREATE TABLE dept(dept_id INT PRIMARY KEY AUTO_INCREMENT,dept_name VARCHAR(20) );1234执行完成后,可以看到就会自动创建一个主键索引,主键约束创建后就会自动给dept_id字段添加个主键索引CREATE TABLE emp(emp_id INT PRIMARY KEY AUTO_INCREMENT,emp_name VARCHAR(20) UNIQUE,dept_id INT,CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id));123456执行后,可以看到创建了三个索引,创建主键约束、唯一性约束、外键约束就会创建与之对应的主键索引、唯一性索引和普通索引1.2.2在已经存在的表上创建索引(显式)显式的方式创建:显式创建表时创建索引,基本语法格式如下:CREATE TABLE table_name [col_name data_type][UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY] [index_name] (col_name [length]) [ASC | DESC]12UNIQUE、FULLTEXT和SPATIAL为可选参数,分别表示唯一索引、全文索引和空间索引INDEX与KEY为同义词,两者的作用相同,用来指定创建索引index.name指定索引的名称,为可选参数,如果不指定,MySQL默认col_name为索引名col_name为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度ASC或DESC指定升序或者降序的索引值存储1、创建普通索引在book表中的year_publication字段上建立普通索引,SQL语句如下:CREATE TABLE book(book_id INT ,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR,#声明索引INDEX idx_bname(book_name));12345678910通过命令查看索引方式1:SHOW CREATE TABLE book;1或SHOW CREATE TABLE book;1这里的Key表示索引方式2:SHOW INDEX FROM book;1性能分析工具:EXPLAINEXPLAIN SELECT * FROM book WHERE book_name = 'mysql检索';12、创建唯一索引声明有唯一索引的字段,在添加数据时,要保证唯一性,但是可以添加nullCREATE TABLE book1(book_id INT,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR,#声明索引UNIQUE INDEX uk_idx_cmt(COMMENT));12345678910当insert重复的语句时,也会报错,和声明唯一约束一样,不能有重复的值,可以插入nullINSERT INTO book1(book_id,book_name,COMMENT)VALUES(1,'book1','第一本书');INSERT INTO book1(book_id,book_name,COMMENT)VALUES(2,'book2',NULL);123453、主键索引通过定义主键约束的方式定义主键索引CREATE TABLE book2(book_id INT PRIMARY KEY ,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR);12345678SHOW INDEX FROM book2;14、创建单列索引CREATE TABLE book3(book_id INT ,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR,#声明索引UNIQUE INDEX idx_bname(book_name));12345678910Seq_in_index为1说明是单列索引5、创建联合索引CREATE TABLE book4(book_id INT ,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR,#声明索引INDEX mul_bid_bname_info(book_id,book_name,info));12345678910分析EXPLAIN SELECT * FROM book4 WHERE book_id = 1001 AND book_name = 'mysql';EXPLAIN SELECT * FROM book4 WHERE book_name = 'mysql';1236、创建全文索引FULLTEXT全文索引可以用于全文搜索,并且只为CHAR、VARCHAR和TEXT列创建索引。索引总是对整个列进行,不支持局部(前缀)索引。|举例1:创建表test4,在表中的info字段上建立全文索引,SQL语句如下:.CREATE TABLE test4(id INT NOT NULL,name CHAR(30) NOT NULL,age INT NOT NULL,info VARCHAR(255),FULLTEXT INDEX futxt_idx_info(info))ENGINE=MyISAM;1234567在MySQL5.7及之后版本中可以不指定最后的ENGINE了,因为在此版本中InnoDB支持全文索引。语句执行完毕之后,使用SHOWCREATETABLE查看表结构:.SHOW INDEX FROM test4;1由结果可以看到,info字段上已经成功建立了一个名为futxt_idx_info的FULLTEXT索引。举例2:创建一个给title和body字段添加全文索引的表CREATE TABLE articles (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,title VARCHAR (200),body TEXT, FULLTEXT index (title, body)) ENGINE = INNODB;123456举例3:CREATE TABLE papers (id int(10) unsigned NOT NULL AUTO_ INCREMENT,title varchar(200) DEFAULT NULL,content text,PRIMARY KEY ('id'),FULLTEXT KEY title (title, content)) ENGINE=MyISAM DEFAULT CHARSET=utf8;1234567不同于like方式的的查询:SELECT * FROM papers WHERE content LIKE ' %查询字符串%' ;1全文索引用match+against方式查询:SELECT * FROM papers WHERE MATCH(title, content) AGAINST ('查询字符串');1明显的提高查询效率注意点1.使用全文索引前,搞清楚版本支持情况;2.全文索引比like+%快N倍,但是可能存在精度问题;3.如果需要全文索引的是大量数据,建议先添加数据,再创建索引。7、创建空间索引空间索引创建中,要求空间类型的字段必须为非空。举例:创建表test5,在空间类型为GEOMETRY的字段上创建空间索引,SQL语句如下:CREATE TABLE test5(geo GEOMETRY NOT NULL,SPATIAL INDEX spa_idx_geo(geo)) ENGINE=MyISAM;1234使用SHOWCREATETABLE查看表结构:SHOW INDEX FROM test5;1test5表的geo字段上创建了名称为spa_jidx_geo的空间索引,注意创建时指定空间类型字段值为非空约束,并且表的存储引擎为MyISAM1.3删除索引MySQL中删除索引使用ALTERTABLE或者DROPINDEX语句,两者可实现相同的功能,DROPINDEX语句在内部被映射到一个ALTERTABLE语句中。查看索引:SHOW INDEX FROM 表名;11、使用ALTERTABLE删除索引,ALTERTABLE删除索引的基本语法格式如下:ALTER TABLE table_name DROP INDEX index_name ;1注意:添加AUTO_INCREMENT约束字段的唯一索引不能被删除通过删除主键约束的方式删除主键索引ALTER TABLE book2 DROP PRIMARY KEY;12、使用DROPINDEX语句删除索引,DROPINDEX删除索引|的基本语法格式如下:DROP INDEX index_name ON table_name;13、删除联合索引中的某个字段索引CREATE INDEX mul_bid_bname_info ON book6(book_id,book_name,info);1但同时也会把表中对应的字段给删除掉ALTER TABLE book6 DROP COLUMN book_name;11.4在已经存在的表上创建索引在已经存在的表中创建索引可以使用ALTERTABLE语句或者CREATEINDEX语句1.4.1使用ALTERTABLE语句创建索引ALTERTABLE语句创建索引|的基本语法如下:ALTER TABLE table.name ADD [UNIQUE | FULLTEXT | SPATIAL] [INDEX | KEY][index_name] (col_name[length],....) [ASC | DESC]12与创建表时创建索引的语法不同的是,在这里使用了ALTERTABLE和ADD关键字,ADD表示向表中添加索引举例1:在book表中创建普通索引、唯一索引、联合索引。CREATE TABLE book5(book_id INT ,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR);12345678ALTER TABLE book5 ADD INDEX idx_cmt(COMMENT);ALTER TABLE book5 ADD UNIQUE uk_idx_bname(book_name);ALTER TABLE book5 ADD INDEX mul_bid_bname_info(book_id,book_name,info);123451.4.2使用CREATEINDEXON语句创建索引基本结构如下:CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_nameON table_name (col_name[length], ...) [ASC | DESC]12效果还是和上面一样的,只是实现的方式有所差异CREATE INDEX idx_cmt ON book6(COMMENT);CREATE UNIQUE INDEX uk_idx_bname ON book6(book_name);CREATE INDEX mul_bid_bname_info ON book6(book_id,book_name,info);123452.隐藏索引在MySQL5.7版本及之前,只能通过显式的方式删除索引。此时,如果发现删除索引后出现错误,又只能通过显式创建索引的方式将删除的索引创建回来。如果数据表中的数据量非常大,或者数据表本身比较大,这种操作就会消耗系统过多的资源,操作成本非常高。从MySQL8.x开始支持隐藏索引(invisibleindexes),只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用forceindex(强制使用索引),优化器也不会使用该索引),确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐顺索引,再删除索引的方式就是软删除。同时,如果想验证某个索弓|删除之后的查询性能影响,就可以暂时先隐藏该索引。注意:主键不能被设置为隐藏索引。当表中没有显式主键时,表中第一个唯一非空索引会成为隐式主键,也不能设置为隐藏索引。索引默认是可见的,在使用CREATETABLE,CREATEINDEX或者ALTERTABLE等语句时可以通过VISIBLE或者INVISIBLE关键词设置索引的可见性。1、创建表时直接创建在MySQL中创建隐藏索引通过SQL语句INVISIBLE来实现,其语法形式如下:CREATE TABLE tablename (propname1 type1 [CONSTRAINT1],propname2 type2 [CONSTRAINT2],...propnamen typen,INDEX [ indexname ] ( propname1 [(length)]) INVISIBLE);1234567上述语句比普通索引多了一个关键字INVISIBLE,用来标记索引l为不可见索引。创建隐藏索引:CREATE TABLE book7(book_id INT ,book_name VARCHAR(100),AUTHORS VARCHAR(100),info VARCHAR(100) ,COMMENT VARCHAR(100),year_publication YEAR,# 创建不可见索引INDEX idx_cmt(COMMENT) invisible);12345678910EXPLAIN SELECT * FROM book7 WHERE COMMENT = '注释信息';1可以看到索引的信息都为null,表述索引被隐藏了2、创建表之后创建ALTER TABLE book7 ADD UNIQUE INDEX uk_idx_bname(book_name) invisible;CREATE INDEX idx_bname_infoON book7(info) invisible;123SHOW INDEX FROM book7;13、修改索引的可见性ALTER TABLE book7 ALTER INDEX idx_bname_info visible;1如果将idx_bname_info索引切换成可见状态,通过explain查看执行计划,发现优化器选择了idx_bname_info索引。测试添加索引之后可见或不可见查询的时间有所差别:EXPLAIN SELECT * FROM book7 WHERE info = '图书信息';1注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的。如果一个索引需要长期被隐藏,那么可以将其删除,因为索引的存在会影响插入、更新和删除的性能。通过设置隐藏索引的可见性可以查看索引对调优的帮助
  • 对称加密与非对称加密算法
    1、对称加密    1.1、加密类型        1.1.1、流加密        1.1.2、块加密    1.2、对称加密算法        1.2.1、DES        1.2.2、3DES        1.2.4、AES        1.2.5、SM1        1.2.6、SM4        1.2.7、RC2        1.2.8、RC4        1.2.9、RC5说明    2、非对称加密        2.1、非对称加密算法        2.1.1、RSA        2.1.2、ECC        2.1.3、SM2    3、对称加密与非对称加密技术比较    4、实践        4.1、对称加密工具            4.1.1、AES加解密            4.1.2、DES加解密        4.2、非对称加密工具            4.2.1、RSA加密            4.2.2、ECC加密参考资料1、对称加密        对称加密算法又称为传统密码算法,加密密钥和解密密钥是相同的。对称加密算法要求通信双方在开始通信前,要首先商定一个用于加密和解密的密钥。算法的安全性就依赖于这个密钥,如果这个密钥被泄露了,就意味着通信不再安全。1.1、加密类型根据加密方式不一样,对称加密算法又分为两种加密类型:流加密和块加密。1.1.1、流加密流加密:每次只对明文中的单个位或单个字节进行加密操作。优点是能够实时进行数据传输和解密,缺点是抗攻击能力比较弱。1.1.2、块加密块加密(也称为分组加密):每次对明文中的一组数据进行加密操作。现在使用的分组加密算法典型的分组长度是64位,这个长度大到足以防止破译攻击,而又小到足以方便使用。块加密算法优点是抗攻击能力强,但实时性稍差。算法模式是块加密法中一系列基本算法步骤的组合。块加密法常用的加密模式:电子编码簿模式(ECB),加密块链接模式(CBC),加密反馈模式(CFB),输出反馈模式(OFB),计数器模式(CTR)。电子编码簿模式(ECB)电子编码簿模式是最简单的操作模式,将输入明文消息分为64位块,然后单独加密每个块,消息中所有块使用相同密钥加密。加密步骤如下:从加密步骤我们可以看出,ECB模式中用同一个密钥加密消息的所有块,如果原消息中重复明文块,则加密消息中的相应密文块也会重复。如果输入中一个明文块多次出现,则输出中相应的密文块也会多次出现,从而让攻击者找到漏洞进行破解。 加密块链接模式(CBC)为了解决ECB模式中相同明文产生相同密文的问题,出现了CBC加密模式。CBC加密模式保证了即使输入中明文块相同,也能得到不同的密文块。CBC加密模式使用了反馈机制。加密步骤如下:第一步接收两个输入:明文块1和一个随机文本块IV(InitializationVector),称为初始化向量。初始向量没有什么特别意义,只是使每个消息唯一。初始化向量是随机生成的,可以保证明文块1即使相同也能产生不同密文块1(随机生成的初始化向量相同的概率是很小的)。加密时第一步使用IV和明文1作异或运算,加密后得到密文1,第二步用密文1和明文2作异或运算,加密后得到密文2,后面依此类推。初始化向量只在第一个明文块中使用,但所有明文块加密依旧使用相同密钥。 加密反馈模式(CFB)不是所有应用程序都能处理数据块,面向字符的应用程序也需要安全性。这时要使用流加密法,可以使用加密反馈模式。加密反馈模式中,数据用更小的单元加密(可以是8位,即一个字符的长度),这个长度小于定义的块长(通常是64位)。假设我们一次处理j位(j通常取8)。第一步:    与CBC模式一样,加密反馈模式也使用64位的初始化向量。初始化向量放在移位寄存器中,第一步产生相应的64位初始化向量密文 第二步:         加密初始化向量最左边的j位与明文前j位进行异或运算,产生密文第一部分密文C。第三步:         初始化向量的位左移j位,使移位寄存器最右边的j位为不可预测的数据,在其中填入C的内容。第四步:    重复1~3步,直到加密所有明文单元总体加密过程如下 输出反馈模式(OFB)输出反馈模式与CFB很相似,唯一差别是,CFB中密文填入加密过程下一阶段,而在OFB中,IV加密过程的输入填入加密过程下一阶段。 计数器模式(CTR)计数器模式与OFB模式非常类似。它使用序号(称为计数器)作为算法的输入。每个块加密后,要填充到寄存器中,使用下一个寄存器值。通常使用一个常数作为初始计数器的值,并且每次迭代后递增(通常是增加1)。计数器块的大虚哎等于明文块的大小。加密时,计数器加密后与明文块作XOR运算,得到密文。 1.2、对称加密算法1.2.1、DES全称为DataEncryptionStandard,即数据加密标准。DES是一种块加密算法,按64位块长加密数据,即把64位明文作为DES的输入,产生64位密文输出。DES工作原理DES使用56位密钥。实际上,最初的密钥为64位,但在DES过程开始之前放弃密钥的每个第八位,从而得到56位密钥,即放弃第8、16、24、32、40、48、56、64位。1.2.2、3DES即三重DES,就是三次执行DES,分为两个大类三个密钥的三重DES首先用密钥K1加密明文块P,然后用密钥K2加密,最后用密钥K3加密,其中K1,K2,K3各不相同两个密钥的三重DES1.2.4、AES全称为AdvancedEncryptionStandard,即高级加密标准,这个标准用来替代原先的DES。1998年6月,Rijndael算法提交给美国国家标准与技术协会(NIST),作为AES的候选算法之一。最初有15种候选算法。2000年10月,NIST宣布AES最终选择Rijndael。Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256位为上限。AES只选择了区块长度固定为128位,密钥长度为128,192或256位。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。1.2.5、SM1SM1为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。1.2.6、SM4SM4由我国国家密码管理局在2012年发布,常用于无线互联网加密等领域。与DES和AES算法类似,SM4算法也是一种分组加密算法。其分组长度为128位,密钥长度也为128位。1.2.7、RC2RC2是一种块加密算法。输入和输出块大小都是64位。而密钥是可变的,从1字节到128字节。1.2.8、RC4RC4是一种流加密算法。1.2.9、RC5RC5是一种块加密算法。块长、轮数、密钥长度都是可变的。块长可取16,32和64位。密钥长度为0~2040位。RC5算法的特定实例记作R5-w/r/b,其中w为分组长度,r为轮数,b为密钥长度。RC5-32/16/16表示RC5的块长为64位(RC5一次加密2字节),16轮和16字节(128位)密钥。说明上面介绍的几种对称加密算法,只有RC4是流加密,其他都是分组加密。上面这些只是对对称加密算法进行了一个简单介绍,没有介绍这些算法的加密步骤,如果你对这些加密算法的步骤感兴趣,推荐两本书籍,可以自行去查阅:《密码编码学与网络安全》-[美]WilliamStallings著 电子工业出版社《密码学与网络安全》-AtulKahate著 清华大学出版社 后面如果有时间和精力,我会单独写文章介绍这些加密算法的加密步骤。2、非对称加密    非对称加密算法是现代密码学取得的最大成就之一,也是密码学近20年来能够快速发展和推广应用的主要原因之一。非对称加密算法中加密密钥和解密密钥不一样,并且解密密钥理论上很难根据加密密钥推算出来。    非对称加密算法的加密密钥是公开的,理论上任何人都可以获得这个公开的加密密钥进行数据加密。但是,使用公开的加密密钥加密的信息只有相应的解密密钥才能解开,而这个解密密钥一般是不公开的。在非对称加密算法中,加密密钥也叫公钥,解密密钥称为私钥。2.1、非对称加密算法2.1.1、RSA    RSA是被研究得最广泛的公钥算法,从提出到现在,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。    RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。    RSA算法生成密钥对以及加解密过程:    (1)选择两个大素数P,Q    设P=7,Q=17    (2)计算N=PxQ    N=7x17=119    (3)选择一个公钥E,使其不是(P-1)与(Q-1)的因子    (P-1)=6=2x3    (Q-1)=16=2x2x2x2    因此我们选的公钥E不能有因子2和3。我们取E=5    (4)选择私钥D,满足:(DxE)mod(P-1)x(Q-1)=1    (Dx5)mod6x16=1    (Dx5)mod96=1    经计算,取D=77    (5)加密时,从明文PT计算密文CT:CT=  modN    假设明文为10    CT= mod119=40    (6)将密文CT发送给接收方    将40发送给接收方    (7)解密时,从密文CT得到明文PT:PT= modN     PT= mod119=10    从上述例子可以看出,RSA算法本身很简单,关键是选择正确的密钥。    假设B要接收A的加密消息,首先生成公钥E和私钥D,私钥D自己保留,公钥E和数字N发布出去,攻击者拿到公钥E和数字N,似乎可以通过试错法计算出私钥D。这里就到了问题的关键,从上述例子可以看出,攻击者只要从N中分解出P和Q,就可以破解私钥。我们上述例子中选择的N很小,实际N是很大的,而大素数分解是极其困难的。2.1.2、ECC大多数使用公钥密码学进行加密和数字签名的产品和标准都使用RSA算法。我们知道,为了保证RSA使用的安全性,最近这些年来密钥的位数一直在增加,这对使用RSA的应用是很重的负担,对进行大量安全交易的电子商务更是如此(从上面RSA加解密的例子可以推测,当要使用1024位密钥时,计算量是很大的)。与RSA相比,ECC可以使用比RSA短得多得密钥得到相同得安全性,因此可以减少处理负荷。另一方面,虽然关于ECC的理论已经很成熟,但ECC的可信度还没有RSA高。ECC全称为ellipticcurvecryptography,即椭圆曲线密码学算法。安全性建立在以下数学困难问题基础之上:椭圆曲线上的离散对数问题:已知有限域Fp椭圆曲线点群Ep(a,b)及其生成元点P∈Ep(a,b),P的阶是一个大素数。已知整数k∈Fp和点P,求点Q=kP是容易的,但已知点P和Q求整数k则是困难的。椭圆曲线上的两个点P和Q,k为整数,Q=kP,椭圆曲线加密的数学原理:点P称为基点,k为私钥,Q为公钥。给定k和P,计算Q很容易。但给定P和Q,求k非常困难。椭圆曲线方程:y= +a+b加解密过程:(1)用户选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点作为基点P(2)用户A选择大数k作为私钥,并生成公钥Q=kP(3)用户A将Ep(a,b),公钥Q和基点P传给B用户(4)用户B接受到信息后,将待传输的明文编码到Ep(a,b)上的一点M,并产生一个随机整数r。(5)用户B计算点C1=M+rQ,C2=rP(6)用户B将C1和C2传给A(7)用户A接收到信息后,计算C1-kC2,就可以得到点M(C1-kC2=M+rQ-krP=M+r(Q-kP)=M)。(8)再对M进行解码就可以得到明文。假设在加密过程中,有一个第三者H,H只能知道椭圆曲线Ep(a,b)、公钥Q、基点P、密文点C(C1,C2),而通过公钥Q、基点P求私钥k或者通过密文点C(C1,C2)、基点P求随机数r都是非常困难的,因此得以保证数据传输的安全。密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:T=(p,a,b,n,x,y)。(p、a、b)用来确定一条椭圆曲线,p为素数域内点的个数,a和b是其内的两个大数;x,y为G基点的坐标,也是两个大数;n为点G基点的阶;以上六个量就可以描述一条椭圆曲线。2.1.3、SM2SM2算法是我国自主知识产权的商业密码算法,是ECC的一种。ECC是基于椭圆曲线方程y= +a+b,SM通过指定系数a,b确定了唯一的一条曲线。简单理解就是ECC选取的椭圆曲线可以有无数个,而SM2只是选取了唯一的一条椭圆曲线。SM2椭圆曲线公钥密码算法推荐曲线参数推荐使用素数域256位椭圆曲线。椭圆曲线方程:y= +a+b曲线参数:p=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFFa=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFCb=28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93n=FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123Gx=32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7Gy=BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0国家密码管理局已经发布了《SM2椭圆曲线公钥密码算法》公告,对SM2算法有非常详细的说明,感兴趣的读者可以自行去查阅。国家密码管理局关于发布《SM2椭圆曲线公钥密码算法》公告(国密局公告第21号)_国家密码管理局(oscca.gov.cn)https://oscca.gov.cn/sca/xxgk/2010-12/17/content_1002386.shtml3、对称加密与非对称加密技术比较对称加密优点:加密速度快缺点:密钥管理分配困难,安全性较低非对称加密优点:安全性较高缺点:加密速度慢对称加密技术加密和解密使用的都是同一个密钥,因此密钥的管理非常困难,在分发密钥的过程中,如果密钥被截获,那后面的通信就是不安全的。而非对称加密技术就很好的解决了这一问题,非对称加密技术使用公钥加密,私钥加密。通信前把公钥发布出去,私钥只有自己保留,即便你的公钥被攻击者拿到,没有私钥,就无法进行解密。那有了非对称加密技术,对称加密是不是就被淘汰了?当然不是,因为非对称加密技术加解密比较慢,不适合对大量数据的加解密。4、实践接下来我们就实际操作一下,先介绍一下开源库openssl。OpenSSL是一个开源且功能强大的包含丰富的密码算法和SSL/TLS协议的库,主要包括的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供了多用途的命令行工具。使用c语言编写,跨平台性能好,支持Linux、Windows、BDS、Mac、VMS等平台。    Openssl由3部分组成        -TheCryptolibrary(密码学算法库)        -TheSSLlibrary(SSL/TLS协议库)             -Commandlinetool(命令行工具) ubuntu下安装命令:sudoapt-getinstallopensslsudoapt-getinstalllibssl-dev安装后就可以直接使用openssl命令行工具。windows可以通过源码安装或者直接下载安装包安装安装包下载地址:Win32/Win64OpenSSLInstallerforWindows-ShiningLightProductions(slproweb.com)http://slproweb.com/products/Win32OpenSSL.html4.1、对称加密工具enc是openssl提供的一个对称加解密命令行工具。安装openssl后,执行命令opensslenc-list,可以看到enc支持的所有对称加密算法lng@ubuntu:~$ openssl enc -listSupported ciphers:-aes-128-cbc               -aes-128-cfb               -aes-128-cfb1-aes-128-cfb8              -aes-128-ctr               -aes-128-ecb-aes-128-ofb               -aes-192-cbc               -aes-192-cfb-aes-192-cfb1              -aes-192-cfb8              -aes-192-ctr-aes-192-ecb               -aes-192-ofb               -aes-256-cbc-aes-256-cfb               -aes-256-cfb1              -aes-256-cfb8-aes-256-ctr               -aes-256-ecb               -aes-256-ofb-aes128                    -aes128-wrap               -aes192-aes192-wrap               -aes256                    -aes256-wrap-aria-128-cbc              -aria-128-cfb              -aria-128-cfb1-aria-128-cfb8             -aria-128-ctr              -aria-128-ecb-aria-128-ofb              -aria-192-cbc              -aria-192-cfb-aria-192-cfb1             -aria-192-cfb8             -aria-192-ctr-aria-192-ecb              -aria-192-ofb              -aria-256-cbc-aria-256-cfb              -aria-256-cfb1             -aria-256-cfb8-aria-256-ctr              -aria-256-ecb              -aria-256-ofb-aria128                   -aria192                   -aria256-bf                        -bf-cbc                    -bf-cfb-bf-ecb                    -bf-ofb                    -blowfish-camellia-128-cbc          -camellia-128-cfb          -camellia-128-cfb1-camellia-128-cfb8         -camellia-128-ctr          -camellia-128-ecb-camellia-128-ofb          -camellia-192-cbc          -camellia-192-cfb-camellia-192-cfb1         -camellia-192-cfb8         -camellia-192-ctr-camellia-192-ecb          -camellia-192-ofb          -camellia-256-cbc-camellia-256-cfb          -camellia-256-cfb1         -camellia-256-cfb8-camellia-256-ctr          -camellia-256-ecb          -camellia-256-ofb-camellia128               -camellia192               -camellia256-cast                      -cast-cbc                  -cast5-cbc-cast5-cfb                 -cast5-ecb                 -cast5-ofb-chacha20                  -des                       -des-cbc-des-cfb                   -des-cfb1                  -des-cfb8-des-ecb                   -des-ede                   -des-ede-cbc-des-ede-cfb               -des-ede-ecb               -des-ede-ofb-des-ede3                  -des-ede3-cbc              -des-ede3-cfb-des-ede3-cfb1             -des-ede3-cfb8             -des-ede3-ecb-des-ede3-ofb              -des-ofb                   -des3-des3-wrap                 -desx                      -desx-cbc-id-aes128-wrap            -id-aes128-wrap-pad        -id-aes192-wrap-id-aes192-wrap-pad        -id-aes256-wrap            -id-aes256-wrap-pad-id-smime-alg-CMS3DESwrap  -rc2                       -rc2-128-rc2-40                    -rc2-40-cbc                -rc2-64-rc2-64-cbc                -rc2-cbc                   -rc2-cfb-rc2-ecb                   -rc2-ofb                   -rc4-rc4-40                    -seed                      -seed-cbc-seed-cfb                  -seed-ecb                  -seed-ofb-sm4                       -sm4-cbc                   -sm4-cfb-sm4-ctr                   -sm4-ecb                   -sm4-ofbenc完整命令openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e ] [-d ] [-a ] [-A] [-k password ] [-kfile filename] [-K key] [-iv IV] [-p] [-P] [-bufsize number] [-nopad] [-debug]-ciphername:对称算法名称(就是上面执行opensslenc-list命令后展示的那些)-infilename:输入文件,默认为标准输入。-outfilename:输出文件,默认为标准输出。-passarg:输入文件如果有密码保护,指定密码来源。-e:进行加密操作,默认操作。-d:进行解密操作。-a:当进行加解密时,它只对数据进行运算,有时需要进行base64转换。设置此选项后,加密结果进行base64编码;解密前先进行base64解码。-A:默认情况下,base64编码结果在文件中是多行的。如果要将生成的结果在文件中只有一行,需设置此选项;解密时,必须采用同样的设置,否则读取数据时会出错。-kpassword:指定加密口令,不设置此项时,程序会提示用户输入口令。-kfilefilename:指定口令存放的文件。-Kkey:密钥,为16进制。-ivIV:初始化向量,为16进制。-p:打印出使用的salt、口令以及初始化向量IV。-P:打印使用的salt、口令以及IV,不做加密和解密操作。-bufsizenumber:设置I/O操作的缓冲区大小,因为一个文件可能很大,每次读取的数据是有限的。-debug:打印调试信息。4.1.1、AES加解密加密命令openssl enc -aes-128-cbc -in in.txt -out out.txt -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF我们选择的密钥长度为128位,从上面列表可以知道,密钥长度可以选取128位,192位,256位。选择的加密模式为cbc,加密模式可以选取ecb,cbc,cfb,ofb,ctr。加密模式是什么意思在上面已经将的很清楚了。演示lng@ubuntu:~/CSDN/enc$ cat in.txthello wordlng@ubuntu:~/CSDN/enc$ openssl enc -aes-128-cbc -in in.txt -out out.txt -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEFlng@ubuntu:~/CSDN/enc$ lsin.txt  out.txtlng@ubuntu:~/CSDN/enc$ cat out.txtBqbu9rk0uOXRgahyZWW7tA==lng@ubuntu:~/CSDN/enc$解密命令openssl enc -aes-128-cbc -in out.txt -out inin.txt -d -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF演示lng@ubuntu:~/CSDN/enc$ openssl enc -aes-128-cbc -in out.txt -out inin.txt -d -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEFlng@ubuntu:~/CSDN/enc$ lsinin.txt  in.txt  out.txtlng@ubuntu:~/CSDN/enc$ cat inin.txthello wordlng@ubuntu:~/CSDN/enc$注意:如果你要阅读密文,要指定参数-a进行base64编码,否则密文是二进制文件,解密时也要指定-a参数,先进行base64解码,再进行解密。     默认是加密操作,加密时可以不指定参数,但解密时我们要指定参数-d     ecb模式是没有初始化向量的,所以ecb模式我们不用指定-iv参数你可以选择不同的密钥长度和不同的加密模式,看看密文有什么不同。我这里就不演示了 4.1.2、DES加解密des密钥长度是固定的,为64位,所以我们只需要选择加密模式。lng@ubuntu:~/CSDN/enc$ cat  in.txthello wordlng@ubuntu:~/CSDN/enc$ openssl enc -des-ecb -K 0123456789AAAAAA -in in.txt -out out.txt -alng@ubuntu:~/CSDN/enc$ lsin.txt  out.txtlng@ubuntu:~/CSDN/enc$ cat out.txtmunBF17bqEeZ28tiddZVxg==lng@ubuntu:~/CSDN/enc$ openssl enc -des-ecb -d -K 0123456789AAAAAA -in out.txt -out inin.txt -alng@ubuntu:~/CSDN/enc$ lsinin.txt  in.txt  out.txtlng@ubuntu:~/CSDN/enc$ cat inin.txthello wordlng@ubuntu:~/CSDN/enc$4.2、非对称加密工具4.2.1、RSA加密这里介绍下openssl命令行工具的两个命令genrsa 生成rsa密钥rsa 用于处理rsa密钥,格式转换和打印信息生成私钥# private.key 为私钥文件,其中包含公钥和私钥,1024为密钥长度openssl genrsa -out private.key 1024导出公钥# 从私钥文件中导出公钥openssl rsa -in private.key -pubout -out public.key使用公钥加密openssl rsautl -encrypt -pubin -inkey public.key -in in.txt -out out.txt使用私钥解密openssl rsautl -decrypt -inkey private.key -in out.txt -out inin.txt4.2.2、ECC加密ecparam 椭圆曲线密钥参数生成及操作ec 椭圆曲线密钥处理工具查看支持的椭圆曲线openssl ecparam -list_curves可以看到支持的所有椭圆曲线,最前面的就是曲线名称。  secp112r1 : SECG/WTLS curve over a 112 bit prime field  secp112r2 : SECG curve over a 112 bit prime field  secp128r1 : SECG curve over a 128 bit prime field  secp128r2 : SECG curve over a 128 bit prime field  secp160k1 : SECG curve over a 160 bit prime field  secp160r1 : SECG curve over a 160 bit prime field  secp160r2 : SECG/WTLS curve over a 160 bit prime field  secp192k1 : SECG curve over a 192 bit prime field  secp224k1 : SECG curve over a 224 bit prime field  secp224r1 : NIST/SECG curve over a 224 bit prime field  secp256k1 : SECG curve over a 256 bit prime field  secp384r1 : NIST/SECG curve over a 384 bit prime field  secp521r1 : NIST/SECG curve over a 521 bit prime field  prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field  prime192v2: X9.62 curve over a 192 bit prime field  prime192v3: X9.62 curve over a 192 bit prime field  prime239v1: X9.62 curve over a 239 bit prime field  prime239v2: X9.62 curve over a 239 bit prime field  prime239v3: X9.62 curve over a 239 bit prime field  prime256v1: X9.62/SECG curve over a 256 bit prime field  sect113r1 : SECG curve over a 113 bit binary field  sect113r2 : SECG curve over a 113 bit binary field  sect131r1 : SECG/WTLS curve over a 131 bit binary field  sect131r2 : SECG curve over a 131 bit binary field  sect163k1 : NIST/SECG/WTLS curve over a 163 bit binary field  sect163r1 : SECG curve over a 163 bit binary field  sect163r2 : NIST/SECG curve over a 163 bit binary field  sect193r1 : SECG curve over a 193 bit binary field  sect193r2 : SECG curve over a 193 bit binary field  sect233k1 : NIST/SECG/WTLS curve over a 233 bit binary field  sect233r1 : NIST/SECG/WTLS curve over a 233 bit binary field  sect239k1 : SECG curve over a 239 bit binary field  sect283k1 : NIST/SECG curve over a 283 bit binary field  sect283r1 : NIST/SECG curve over a 283 bit binary field  sect409k1 : NIST/SECG curve over a 409 bit binary field  sect409r1 : NIST/SECG curve over a 409 bit binary field  sect571k1 : NIST/SECG curve over a 571 bit binary field  sect571r1 : NIST/SECG curve over a 571 bit binary field  c2pnb163v1: X9.62 curve over a 163 bit binary field  c2pnb163v2: X9.62 curve over a 163 bit binary field  c2pnb163v3: X9.62 curve over a 163 bit binary field  c2pnb176v1: X9.62 curve over a 176 bit binary field  c2tnb191v1: X9.62 curve over a 191 bit binary field  c2tnb191v2: X9.62 curve over a 191 bit binary field  c2tnb191v3: X9.62 curve over a 191 bit binary field  c2pnb208w1: X9.62 curve over a 208 bit binary field  c2tnb239v1: X9.62 curve over a 239 bit binary field  c2tnb239v2: X9.62 curve over a 239 bit binary field  c2tnb239v3: X9.62 curve over a 239 bit binary field  c2pnb272w1: X9.62 curve over a 272 bit binary field  c2pnb304w1: X9.62 curve over a 304 bit binary field  c2tnb359v1: X9.62 curve over a 359 bit binary field  c2pnb368w1: X9.62 curve over a 368 bit binary field  c2tnb431r1: X9.62 curve over a 431 bit binary field  wap-wsg-idm-ecid-wtls1: WTLS curve over a 113 bit binary field  wap-wsg-idm-ecid-wtls3: NIST/SECG/WTLS curve over a 163 bit binary field  wap-wsg-idm-ecid-wtls4: SECG curve over a 113 bit binary field  wap-wsg-idm-ecid-wtls5: X9.62 curve over a 163 bit binary field  wap-wsg-idm-ecid-wtls6: SECG/WTLS curve over a 112 bit prime field  wap-wsg-idm-ecid-wtls7: SECG/WTLS curve over a 160 bit prime field  wap-wsg-idm-ecid-wtls8: WTLS curve over a 112 bit prime field  wap-wsg-idm-ecid-wtls9: WTLS curve over a 160 bit prime field  wap-wsg-idm-ecid-wtls10: NIST/SECG/WTLS curve over a 233 bit binary field  wap-wsg-idm-ecid-wtls11: NIST/SECG/WTLS curve over a 233 bit binary field  wap-wsg-idm-ecid-wtls12: WTLS curve over a 224 bit prime field  Oakley-EC2N-3:IPSec/IKE/Oakley curve #3 over a 155 bit binary field.Not suitable for ECDSA.Questionable extension field!  Oakley-EC2N-4:IPSec/IKE/Oakley curve #4 over a 185 bit binary field.Not suitable for ECDSA.Questionable extension field!  brainpoolP160r1: RFC 5639 curve over a 160 bit prime field  brainpoolP160t1: RFC 5639 curve over a 160 bit prime field  brainpoolP192r1: RFC 5639 curve over a 192 bit prime field  brainpoolP192t1: RFC 5639 curve over a 192 bit prime field  brainpoolP224r1: RFC 5639 curve over a 224 bit prime field  brainpoolP224t1: RFC 5639 curve over a 224 bit prime field  brainpoolP256r1: RFC 5639 curve over a 256 bit prime field  brainpoolP256t1: RFC 5639 curve over a 256 bit prime field  brainpoolP320r1: RFC 5639 curve over a 320 bit prime field  brainpoolP320t1: RFC 5639 curve over a 320 bit prime field  brainpoolP384r1: RFC 5639 curve over a 384 bit prime field  brainpoolP384t1: RFC 5639 curve over a 384 bit prime field  brainpoolP512r1: RFC 5639 curve over a 512 bit prime field  brainpoolP512t1: RFC 5639 curve over a 512 bit prime field  SM2       : SM2 curve over a 256 bit prime field生成参数文件选择一条曲线生成参数文件openssl ecparam -name secp256k1 -out secp256k1.pem显示参数文件参数openssl ecparam -in secp256k1.pem -text -param_enc explicit -noout使用参数文件生成私钥openssl ecparam -in secp256k1.pem -genkey -out secp256k1-key.key从私钥中导出公钥openssl ec -in secp256k1-key.key -pubout -out public.key参考资料《密码编码学与网络安全》-[美]WilliamStallings著 电子工业出版社《密码学与网络安全》-AtulKahate著 清华大学出版社 
  • 1
  • 2
  • 3
  • ···
  • 1482
  • 1483
  • 1484
  • ···
  • 1486
  • 1487
  • 1488
最新文章
  • jpg怎么转换成ico图标
  • json是什么意思
  • 如何进行网站流量统计分析?
  • 网页定时刷新是干嘛的
  • user agent检测详解
  • 支付宝微信二维码如何合并?
  • 如何制作ico图标
  • 随机密码生成器安全吗?
  • Base64是什么
  • 时间戳是什么意思
冀ICP备2020020658号