对称(DESAES)与非对称(RSASSL数字证书)加密介绍及实际应用

对称(DESAES)与非对称(RSASSL数字证书)加密介绍及实际应用

2023年7月27日发(作者:)

对称(DESAES)与⾮对称(RSASSL数字证书)加密介绍及实际应⽤本⽂不对具体的算法做深⼊研究,只是讲解各种安全算法的原理和使⽤场景。⼀、数据校验算法数据校验,是为保护数据的完整性,⽤⼀种指定的算法对原始数据计算出的⼀个校验值。当接收⽅⽤同样的算法再算⼀次校验值,如果两次校验值⼀样,表⽰数据完整。1、奇偶校验 能检测出信息传输过程当中的⼀位误码。出现错误不能检测出错误,只能要求重发。2、 CRC循环冗余校验 通过增加若⼲冗余位,可以检测出传输过程中的错误。检错和纠错能⼒强,在通信领域运⽤较⼴泛。3、MD5校验 MD5算法是⼀种信息摘要算法,是通过哈希映射的原理得到⼀个⼤⽂件简短的MD5值。该算法是⼀种不可逆算法,也就是说开发者不能通过MD5值得到原始⽂件的数据。这⾥有⼀种可能性,不同的数据⽂件得到相同的MD5值,但是这种情况⼀般开发过程当中都不予考虑(数据碰撞)。4、 SHA (Secure Hash Algorithm)是由美国专门制定密码算法的标准机构——美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA为20字节(160位)、SHA256为32字节(256位)、 SHA384为48字节(384位)、SHA512为64字节(512位),由于它产⽣的数据摘要的长度更长,因此更难以发⽣碰撞,因此也更为安全,它是未来数据摘要算法的发展⽅向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相⽐,也相对较慢。 同MD5算法相同,他也是⼀种不可逆的算法。⼆、对称加密算法1、Base64 编解码 该算法只能称为⼀种校验,是对原始的数据进⾏了⼀个编码的过程。 有编码就有解码,该过程是⼀个可逆的。该算法安全性较差,可以很轻松的通过解码将密⽂转换为明⽂,从⽽获取信息。2、DES 数据加密算法 是对称加密算法领域中的典型算法,现在认为是⼀种不安全的加密算法,因为现在已经有⽤穷举法攻破DES密码的报道了。尽管如此,该加密算法还是运⽤⾮常普遍,是⼀种标准的加密算法。3DES是DES的加强版本。 DES加密的秘钥是 56位,⽽3DES加密算法的秘钥是 112位或者168位。3DES加密处理速度较慢、密钥计算时间较长、加密效率不⾼。3、AES 数据加密算法(推荐使⽤)Advanced Encryption Standard ,⾼级数据加密标准,AES算法可以有效抵制针对DES的攻击算法。密钥建⽴时间短、灵敏性好、内存需求低、安全性⾼DES/3DES/AES 三种加密算法的对⽐如下:4、异或加密异或运算中,如果某个字符(或数值)x 与 ⼀个数值m 进⾏异或运算得到y,则再⽤y 与 m 进⾏异或运算就可以还原为 x ,因此应⽤这个原理可以实现数据的加密解密功能。这种加密算法较简单,只是简单的将明⽂转换为不易看出的密⽂,破解的复杂度完全取决于秘钥的长度。三、⾮对称加密算法 公开密钥加密,⼜称 asymmetric cryptography (⾮对称加密),即存在两把不同的密钥,分别称为公钥 Pu 和私钥 Pr,公钥通常⽤来加密明⽂ M,只有私钥才能解密密⽂ C,如果⽤ E 和 D 分别表⽰加密和解密算法,那么有:C = E(M,Pu); // 加密公式,M为明⽂,C为密⽂,M = D(C,Pr); // 解密公式  传统的对称加密需双⽅共享相同的密钥,通信安全很⼤程度依赖双⽅是否能妥善的管理密钥。公开密钥加密发明是密码学最为重要的⾥程碑之⼀,它从数学的⾓度保证了通信安全。公开密钥加密体系有三⼤范畴:Encryption/Decryption:即加密与解密,发送⽅⽤接收⽅的公钥加密消息(秘钥由接收⽅⽣成,传送给发送⽅)Digital Signature:数字签名,发送⽅⽤公钥加密消息摘要⽣成签名,保证消息的完整性和可靠性Key Exchange:安全的交换密钥,通常⽤于交换对称加密的密钥()1、RSA加密这种算法以欧拉函数为基础,这⾥不具体展开:这种算法⾮常,密钥越长,它就越难破解。根据已经披露的⽂献,⽬前被破解的最长RSA密钥是768个⼆进制位。也就是说,长度超过768位的密钥,还⽆法破解(⾄少没⼈公开宣布,因为⼤数的因式分解计算量特别⼤)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。具体原理可以见:公钥私钥的⽣成及加解密过程2、SSL/TLS协议 具体来说,SSL/TLS 并不是⼀种算法,⽽是为了保证通信安全的⼀种协议,当然⾥⾯⽤到了相关加密算法如⾮对称加密算法、数字证书、HD秘钥交换算法等。Https多使⽤这种协议进⾏⽹络数据的传输。

通过上述这张图⼤致了解这种协议的通信过程。上述过程的⽬的只是为了获取⽐较安全的Session Key,当然这个Key需要Client Random +Server Random + Permaster secret 三者共同⽣成,安全性较⾼。Session key ⽤于后⾯通信对数据进⾏对称加密。 双⽅获得Session Key后通过http协议进⾏数据传输,Session Key ⽤来对http传输的内容进⾏加密。关于SSL/TLS的详细讲解请参考 阮⼀峰的博客链接。TOTPTOTP 的全称是"基于时间的⼀次性密码"(Time-based One-time Password)。它是公认的可靠解决⽅案,已经写⼊国际标准 。它的步骤如下。第⼀步:⽤户开启双因素认证后,服务器⽣成⼀个密钥。第⼆步:服务器提⽰⽤户扫描⼆维码(或者使⽤其他⽅式),把密钥保存到⽤户的⼿机。也就是说,服务器和⽤户的⼿机,现在都有了同⼀把密钥。第四步,服务器也使⽤密钥和当前时间戳,⽣成⼀个哈希,跟⽤户提交的哈希⽐对。只要两者不⼀致,就拒绝登录。注意,密钥必须跟⼿机绑定。⼀旦⽤户更换⼿机,就必须⽣成全新的密钥。算法原理:TC = floor((unixtime(now) − unixtime(T0)) / TS)上⾯的公式中,TC 表⽰⼀个时间计数器,unixtime(now)是当前 Unix 时间戳,unixtime(T0)是约定的起始时间点的时间戳,默认是0,也就是1970年1⽉1⽇。TS 则是哈希有效期的时间长度,默认是30秒。因此,上⾯的公式就变成下⾯的形式。TC = floor(unixtime(now) / 30)所以,只要在 30 秒以内,TC 的值都是⼀样的。前提是服务器和⼿机的时间必须同步。接下来,就可以算出哈希了。TOTP = HASH(SecretKey, TC)TOTP 有硬件⽣成器和软件⽣成器之分,都是采⽤上⾯的算法。数字签名过程(防⽌公钥被伪造 ):1、通过公钥私钥进⾏加密通信,发送⽅发送的内容只有通过私钥才能打开,所以保证了发送信息的私密性。2、第三⽅可以把伪造的公钥给发送⽅,再截获发送的信息,通过⾃⼰的私钥解密信息。 这⾥Https协议中引⼊的CA(certificate authority)可以很好的解决这个问题。证书中⼼⽤⾃⼰的私钥为传输的公钥和⼀些信息进⾏加密,发送者可以通过证书中的公钥解密证书中的信息,这些信息中包含了需要传送的公钥。(暂且认为证书中的信息都是对的,⼀般证书中⼼都是可靠性⽐较⾼的机构颁发的)通过Chrome打开百度⽹页的时候,F12建, Security菜单栏可以看到百度的证书。证书⾥⾯包含:颁发者、颁给者、公钥、有效期等信息。a) 客户端向服务器发出加密请求b) 服务器⽤⾃⼰的私钥加密⽹页以后,连同本⾝的数字证书,⼀起发送给客户端c) 客户端(浏览器)的"证书管理器",有"受信任的根证书颁发机构"列表。客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内。Android端如何使⽤https发送请求 ⽹上关于https的使⽤⽂章⼤多数是关于浏览器如何通过签名进⾏验证的,浏览器会保存各个⽹站由CA认证中⼼颁发的数字签名并进⾏校验。那么问题来了,当客户端和服务端握⼿完成后,客户端如何判断服务端发送的公钥和相关信息没有被第三⽅篡改(对应c图)? 其实,客户端则需要提前将CA证书导⼊进来,当创建请求时将证书的相关信息添加进去即可完成https请求和验证。客户端添加证书实现:InputStream is = getAssets().open("");private SSLSocketFactory certificates){ try{ CertificateFactory certificateFactory = tance("X.509"); KeyStore keyStore = tance(aultType()); (null); int index = 0; for (InputStream certificate : certificates) { String certificateAlias = ng(index++); tificateEntry(certificateAlias, teCertificate(certificate)); if (certificate != null) (); } SSLContext sslContext = tance("TLS"); TrustManagerFactory trustManagerFactory = tance(aultAlgorithm()); (keyStore); ( null, stManagers(), new SecureRandom() ); return ketFactory(); }catch (Exception e){ } return null; }创建HttpsURLConnection完成后将证书信息设置进去再发送请求:SocketFactory(sslSocketFactory);http⽹络请求中的token 我们都是知道HTTP协议是⽆状态的,这种⽆状态意味着程序需要验证每⼀次请求,从⽽辨别客户端的⾝份,那么如何通过只登陆⼀次就能实现后续已登录状态呢?1.⽤户登录校验,校验成功后就返回Token给客户端。2.客户端收到数据后保存在客户端3.客户端每次访问API是携带Token到服务器端。4.服务器端采⽤filter过滤器校验。校验成功则返回请求数据,校验失败则返回错误码那么这⾥有个问题: 服务端怎么知道携带的token就是这个⽤户的token⽽不是伪造的? 后续补充签名的实际应⽤ 现在有三个参数(A、B、C 封装在⼀个类Data中)需要传输到服务端,那么如何保证 这三个数据不是别⼈伪造发送的,可以在传这三个数据数据之外再添加⼀个数据 sign(String类型)。  客户端sign的⽣成算法:  第⼀步:对三个参数名称(与服务端提前约定好传输变量的名称)进⾏字典排序,拼接成字符串StringA(key1=value1&key2=value2&key3=value3),同时字符串的拼接遵循指定的规则。  第⼆步:在stringA最后拼接秘钥key(只有服务端和客户端知道,第三⽅不能获得,这也是签名的关键)得到finalStringA  第三部: 对finalStringA 做MD5计算,并将字符数组转换成16进制的字符串。    ⾃此sign⽣成过程结束。⽣成根据Data 中A、B、C三个参数的值以及Key ⽣成了sign之后,将sign值赋给Data中的sign。将Data转换成JSONObject格式再转换成字符数组通过 HttpURLConnection传送到服务端。服务端通过拿到A、B、C的数值后会⾃⼰通过同样的算法⽣成sign,如果和客户端传送的Sign不⼀样则这次传送可能是第三⽅伪造的。  这种签名就保证了第三⽅不能伪造数据和服务端进⾏通信。(具体的流程如下图所⽰)但是这⾥有个问题,其它⼈员获取到了通信秘钥secret,则可以伪造数据,毕竟客户端的代码很有可能被破解的(就算放在native层都可以被破解),但是对于安全等级较低通信这种加密措施也⾜够了。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690462365a352764.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信