大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
我们在开发中常会遇到这种需求:通信的两端需要传输安全级别较高的数据,这需要我们传输的加密数据既要难以破解,又要可逆的解密过程。哈希算法虽难以破解,但并非适用于通信中的加解密传输。这就需要基于秘钥管理的加密技术了。对称加密是最简单快速的加密方式,所谓对称加密,即加解密双方都掌握相同的秘钥,通过同一秘钥完成加解密操作。常用的对称加密算法有:
创新互联是专业的屯溪网站建设公司,屯溪接单;提供网站建设、成都网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行屯溪网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
Go标准库中的加密相关包都有相应的支持,下面我们来逐一演示:
所以要实现DES加密需要准备如下要求:
以上,秘钥和初始化向量值需要自己管理,末尾分组的填充算法和删除算法需要自己实现。下面我们实现一个填充算法和删除算法:
以上实现思路为:计算出最后一个分组需要填充的字节数(1-8),并把这个数作为需要填充的占位符,再把填充后的分组与源数据拼接就得到待加密的字符串。
Go通过crypto/des包支持DES加密算法:
使用以上加解密方法:
以上就是Go 中DES的加解密实现,可见其加密的安全性依赖于秘钥的管理,而且其只有64Bit的秘钥长度在算力越来越高的现在已经不够安全了,这也是对称加密的弱点,在实际的网络项目中,秘钥的分发需要依赖其他方式的配合。
对于DES秘钥较弱的问题做了一些改进,这就是三重DES加密算法,其原理与DES类似,唯一不同的是秘钥从一组八字节变成三组二十四字节(192Bit)。其加密强度也和秘钥设置相关,此处演示我们也用CBC分组模式,三重加密执行顺序分别为,加密-解密-加密。
为了兼容DES,只有当秘钥一组和秘钥二组相同时,3DES其加密安全性和DES相同,其余秘钥的分组设置都是三重DES加密。
使用以上加解密方法:
随着时代的发展,DES和3DES于现今的算力和性能要求来说已经逐渐落伍,为了适应更高的安全性和性能需要,业界采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。这就是AES对称加密算法,在现今的项目开发中,建议使用这种加密方式。
AES的基本要求是,采用对称分组密码体制,密钥的长度最少支持为128、192、256,分组长度128位。
所以要实现AES加密需要准备如下要求:
Go通过crypto/aes包支持DES加密算法:
以上,其用法和DES差不多,只不过秘钥管理稍微不同而已。
椭圆曲线密码学(英语:Elliptic curve cryptography,缩写为 ECC),一种建立公开密钥加密的算法,基于椭圆曲线数学。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。
ECC的主要优势是在某些情况下它比其他的方法使用更小的密钥——比如RSA加密算法——提供相当的或更高等级的安全。
椭圆曲线密码学的许多形式有稍微的不同,所有的都依赖于被广泛承认的解决椭圆曲线离散对数问题的 困难性上。与传统的基于大质数因子分解困难性的加密方法不同,ECC通过椭圆曲线方程式的性质产生密钥。
ECC 164位的密钥产生的一个安全级相当于RSA 1024位密钥提供的保密强度,而且计算量较小,处理速度 更快,存储空间和传输带宽占用较少。目前我国 居民二代身份证 正在使用 256 位的椭圆曲线密码,虚拟 货币 比特币 也选择ECC作为加密算法。
具体算法详解参考:
本系列文章包含以下内容
本系列文章中大写 C 统一表示客户端,大写 S 表示服务器端。
定义摘自维基百科。
完整性保障很容易理解, C (客户端)与 S (服务器端)通信,客户端发出信息[ 转10000给张三 ],经过网络传输后,由于网络丢包变成了[ 转100块给张三 ],客户端估计会被张三揍哭。因此服务端(收到信息的一方)需要保证收到的信息确实一丝一毫都没变。这就是完整性。
保证完整性通常通过哈希值来实现。比如我们可以设计一种弱鸡的算法,计算字数的个数作为哈希,那么信息变成了[ 转10000块给张三,10 ],其中10就是哈希值,那么如果服务端收到的信息是[ 转100块给张三,10 ],服务端检查到哈希值不正确就知道消息在传输过程中发生了错误。然而如果信息变成了[ 转20000块钱给张三,10 ],这个弱鸡算法就不能帮助服务器检查到这个错误。因此哈希算法基础的要求就是碰撞(给定信息1,构造另一段信息2,使得2的哈希值与1相等)的难度。
什么是安全性呢?
安全性包含两个方面,假定 C 是你, S 是你女朋友。 S 给 C 发信息[ 给我打10000块 ]。 C 的第一反应是什么?是确认 S 真的是你女朋友。因此安全性的第一个方面是确定双方的通信身份。
假如 C 想给 S 回复[ 今晚XXXX不可描述 ], C 需要确认什么?一定是这段信息没人在窃听。这就是安全性的第二个方面。
如何解决第一个问题:C和S如何确定 你真的是你 ? 在 C 和 S 互为男女朋友的情况下,C可以和S约定一下暗号,比如 天王盖地虎 对 小鸡炖蘑菇 ,在每次通信之前先对一下暗号。
如果只有C和S通信,约定暗号自然是可行的。但是如果C或者S不只一个呢。比如有C1,C2,那么如果用同样的暗号,C2知道暗号是什么后就可以欺骗S说自己是C1。如果都约定不同的暗号,那么假如有C1,C2,... ,C10000,那么就有S就需要记住10000个暗号,并且每新来一个C,就需要多记住一个暗号。
S表示,太累了。“给你们一段我的手写体吧,以后你们验证笔迹一样就能确定我是我了”
"笔迹,太容易伪造了吧!", 数学表示,"是时候看我展现真正的实力了!"
困难问题在数学中通常是"讨厌"的存在,数学家们会穷尽毕生去解决。密码学却是数学中的一个有趣的分支,它反其道而行之,核心是去证明某个问题是困难的。什么是困难问题?民科定义就是在 现有的公开的数学 下,要解决这个问题得花成百上千年。专业术语表达是 NP问题 ,或者从安全意义上说 解决这个问题获得的利益小于解决问题付出的代价 。
"嘿嘿嘿,这道题你们做不出来,但是我有后门,我会做"。加密算法站了出来。
先用 非对称加密 (加密密钥和解密密钥不相同)来解决 你真的是你 这个问题。
在非对称算法中,有两个密钥,一个是公钥,一个私钥。通常情况下私钥自己留着,公钥给对外公开。私钥加密后的信息,公钥可以解密还原内容。 由公钥以及已经发生过的加密解密信息推算出私钥是一个困难问题 。
我们来尝试构造一个弱鸡的非对称算法,并假装它是一个困难问题。
这个算法是这样的,假定我们发出的信息只能是[1,2,3,4,5,...,10], 公钥是10。并且我们自己保留私钥7。加密算法是 (x+7)%17, 解密算法是 (x+10)%17。我们假装通过10和已经发生过的加解密的过程无法推算出私钥7。
由于((x+7)%17+10)%17 = x, 比如对信息5加密,用私钥7加密5+7=12,用公钥10解密(12+10)%17=22%17=5, 就可以将信息还原。
有了这个算法,C需要验证S的身份只需要说一句,“嘿,6加密后的数据是什么”,S算了以下回复,“13”,客户端用公钥运算(13+10)%17果然是6,就可以快乐的回应,“来啦,老弟!”
在上面的场景中,有了非对称密钥算法,S可以换成说,“我的公钥放在网上了,你们自己去拿,拿好以后,以后验证我私钥加密过的信息解密后就确认我是我了”。(注:这里不谈及CA及信任链,默认C拿到证书后可以确认这个证书确实是S的证书)
如何解决第二个问题:C和S如何确保通信没有被窃听,或者即使被窃听也不能听懂内容究竟是什么?
在互联网环境下,保证第一条是不可能的,公开网络中任何一个节点都有可能被抓包解析。非对称加密通过私钥加密信息在网上传输可以应对这个问题。但这样做有两个缺点:一个是非对称加密通常相对比较慢,第二个问题是虽说非对称加密是安全的,但架不住老是拿同样的公钥私钥来传输大量的信息,这样做会破坏它的安全性。因此,通常会选择使用用公钥沟通,得出一个在一次对话过程中使用的对称加密(公钥和私钥相同)的密钥来(密钥交换协议),并在之后的通信中使用对称加密算法来加密传输内容,来保证传输过程的安全性。
对称加密容易理解,这里不做多谈。
注意:以上简介均非规范描述,只是以简化的形式来描述网络通信面临的安全问题以及解决的方法。
简介中提到的对称加密算法,非对称加密算法,和没有提及的如何在一次会话中采用安全的协议来沟通出对称密钥,均可以在 维基百科 上找到相应的介绍。
对称加密有非常好的安全性,其加解密计算的性能也较高,但其有两个重要缺点:
在如今开放的信息社会,秘钥的管理愈加困难,非公开的秘钥机制虽然破解较难,但还是有遭到攻击的可能性,由于对称加密需要加解密双方共同握有私钥,所有生成秘钥的一方必须分发给另一方才能进行安全通行,这就难免秘钥在网络中传输,网络是不可靠的,其有可能被拦截或篡改。于是就产生了公开秘钥体制,即服务方根据特定算法产生一对钥匙串,自己持有私钥小心保存,而公钥公开分发,在通信中,由公钥加密进行网络传输,而传输的信息只能由私钥解密,这就解决了秘钥分发的问。公开秘钥体制就是非对称加密,非对称加密一般有两种用途:
如今的非对称加密比较可靠的有RSA算法和ECC算法(椭圆曲线算法),RSA的受众最多,但近年来随着比特币、区块链的兴起,ECC加密算法也越来越受到青睐。下面我们先介绍一下RSA加密算法的使用,ECC我们下一讲展开。
公钥密码体系都是要基于一个困难问题来保证其安全性的,RSA是基于大数分解,将一个即使是计算机也无能为力的数学问题作为安全壁垒是现代密码学的实现原理。讲述这类数学问题需要庞杂的数论基础,此相关部分在此不再展开,感兴趣的请出门右拐搜索欧几里得证明、欧拉函数等数论部分知识。
Go标准库中crypto/rsa包实现了RSA加解密算法,并通过crypto/x509包实现私钥序列化为ASN.1的DER编码字符串的方法,我们还使用编解码包encoding/pem(实现了PEM数据编码,该格式源自保密增强邮件协议,目前PEM编码主要用于TLS密钥和证书。)将公私钥数据编码为pem格式的证书文件。
使用以上加解密方法: