7 Go密码学(四) 非对称加密之RSA
对称加密有非常好的安全性,其加解密计算的性能也较高,但其有两个重要缺点:
在汕头等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都做网站、网站建设 网站设计制作按需网站制作,公司网站建设,企业网站建设,品牌网站制作,全网整合营销推广,外贸营销网站建设,汕头网站建设费用合理。
在如今开放的信息社会,秘钥的管理愈加困难,非公开的秘钥机制虽然破解较难,但还是有遭到攻击的可能性,由于对称加密需要加解密双方共同握有私钥,所有生成秘钥的一方必须分发给另一方才能进行安全通行,这就难免秘钥在网络中传输,网络是不可靠的,其有可能被拦截或篡改。于是就产生了公开秘钥体制,即服务方根据特定算法产生一对钥匙串,自己持有私钥小心保存,而公钥公开分发,在通信中,由公钥加密进行网络传输,而传输的信息只能由私钥解密,这就解决了秘钥分发的问。公开秘钥体制就是非对称加密,非对称加密一般有两种用途:
如今的非对称加密比较可靠的有RSA算法和ECC算法(椭圆曲线算法),RSA的受众最多,但近年来随着比特币、区块链的兴起,ECC加密算法也越来越受到青睐。下面我们先介绍一下RSA加密算法的使用,ECC我们下一讲展开。
公钥密码体系都是要基于一个困难问题来保证其安全性的,RSA是基于大数分解,将一个即使是计算机也无能为力的数学问题作为安全壁垒是现代密码学的实现原理。讲述这类数学问题需要庞杂的数论基础,此相关部分在此不再展开,感兴趣的请出门右拐搜索欧几里得证明、欧拉函数等数论部分知识。
Go标准库中crypto/rsa包实现了RSA加解密算法,并通过crypto/x509包实现私钥序列化为ASN.1的DER编码字符串的方法,我们还使用编解码包encoding/pem(实现了PEM数据编码,该格式源自保密增强邮件协议,目前PEM编码主要用于TLS密钥和证书。)将公私钥数据编码为pem格式的证书文件。
使用以上加解密方法:
GoLang -- json文件操作
json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好。官方提供的Json解析包已经非常强大,我们接下来讲解Json的序列化与反序列化操作。另外还有一些第三方的Json解析库,也能够高效的操作Json对象,比如simplejson,ffjson等。下面是两个比较重要的函数:
• Json Marshal:将数据编码成json字符串
Marshal 用于将struct对象序列化到json对象中。v是interface{}类型,任何类型都实现了空接口。
1:tag中的第一个参数是用来指定别名,比如Name 指定别名为 username `json:"username"`
2:如果不想指定别名但是想指定其他参数用逗号来分隔,omitempty 指定到一个field时,如果在赋值时对该属性未赋值或者对该属性赋值为 zero value,那么将Person序列化成json时会忽略该字段
3:- 指定到一个field时,无论有没有值,将Person序列化成json时都会忽略该字段
4:string 指定到一个field时,比如Person中的Count为int类型 如果没有任何指定在序列化到json之后也是int 比如这个样子 “Count”:0,但是如果指定了string之后序列化之后也是string类型的,那么就是这个样子"Count":"0"
• struct序列化为Json
• slice序列化为Json
• map 序列化为Json
• Json Unmarshal:将json字符串解码到相应的数据结构,Unmarshal的第一个参数是[]byte,第二个参数是接受json解析的数据结构。
下面我们依次讲解Json的操作。
1:将Json序列化进入结构体
2::将Json序列化到结构体slice
3:将Json序列化进Map
4:将Json序列化进Slice
go语言 md5加密的密码怎样解密
理论上是不能破解的,因为md5采用的是不可逆算法。
有的网站上提供MD5解密,是因为有大量的存储空间来保存源码和加密后的密码,当解密时就是一个查询的过程,稍微复杂点的查询就无法完成。
Golang中的自定义json序列化
后端开发人员跟前端对接接口的时候,或多或少都会面临一些沟通问题,比如说枚举字符的定义,比如有整形状态字段: state
通常给前端的时候,前段要做的是将1,2,3以及对应的中文释义存储为key/value的形式,key与value单看都无法知道对方的语义,
比如我只知道状态值为“1”, 是无法将其与“成功”对应起来的(当然这套状态的设计者肯定是知道的),后端通常给到前端的restful api
接口定义也是key/value的形式,这乍一看其实也没啥毛病,只要有key/value也没问题,后端定义通常会是
但数字的表现形式终归是不不太明确的,如果对状态的定义换成以下形式:
基本可以理解为中英文互译了,理解起来也会更清晰一些不是,如果这么做的话,后端给到前端的响应字段状态的类型就需要修改成字符器格式
后端还是要做一层字符串到整型的转换,从目的来讲,我们只是想返给前端的 state 字段是字符串而已,也就是在做json序列化的时候将整型与字符串做一层转换,有更优雅的做法如下所示
只需要做两件事,自定义类型 MyState ,实现 MarshalJSON 方法
只要类型实现了 MarshalJSON 方法,在json序列化时就会调用此方法,如此一来,我们就轻松实现了自定义json序列化,反序列化同样如此
实现起来也很简单
需要注意的是, UnmarshalJSON 方法操作过程需要给 receiver 也就是 u 赋值,所以必须是指针类型,同样的,在实现
MarshalJSON 方法, receiver 的类型需要与结构体定义中的类型保持一致,否则自定义序列化会失败
参考:
网页标题:go语言序列化加密 go 序列化
浏览路径:http://lswzjz.com/article/ddsochc.html