本文不对具体算法进行深入研究,只是描述各种安全算法的原理和使用场景。
一、数据校验算法
数据有效性是通过指定的算法对原始数据计算出的校验值,以保护数据的完整性。如果接收方使用相同的算法再次计算校验值,如果两次校验值相同,则说明数据完整。
1. 奇偶校验
可以检测信息传输过程中的比特错误。如果发生错误,我们无法检测到错误,只能请求重传。
2.CRC循环冗余校验
通过添加一些冗余位,可以检测传输过程中的错误。它具有强大的检错和纠错能力,广泛应用于通信领域。
3、MD5验证
MD5算法是一种信息摘要算法,通过哈希映射原理获得大文件的短MD5值。该算法是不可逆算法。这意味着开发人员无法通过MD5 值检索原始文件的数据。这里,不同的数据文件可以得到相同的MD5值,但在开发过程中通常不会考虑这种情况(数据碰撞)。
4.沙
SHA(安全哈希算法)由—— 美国国家标准与技术研究所(NIST) 开发,该组织是美国致力于开发密码算法的标准组织。 SHA系列算法的摘要长度为: SHA 为20 字节(160 位),SHA256 为32 字节(256 位),SHA384 为48 字节(384 位),SHA512 为64 字节(512 位)。生成的数据摘要更长,使碰撞更加困难和安全。这是未来数据汇总算法的发展方向。 SHA系列算法的数据摘要长度较长,因此其运行速度相对比MD5慢。
和MD5算法一样,这也是一种不可逆算法。
二、对称加密算法
1.Base64编码与解码
这个算法只能描述为一种验证,是对原始数据的编码过程。 有编码就有解码,这个过程是可逆的。这种算法并不安全,通过对密文进行解码,可以轻松地将其转换为明文并获取信息。
2.DES数据加密算法
这是对称加密算法领域的典型算法,由于据报道曾使用过激烈的方法来破解Masu 密码,因此现在被认为是不安全的加密算法。尽管如此,这种加密算法仍然非常常用,并且是标准的加密算法。 3DES 是DES 的增强版本。
DES加密的私钥是56位,而3DES加密算法的私钥是112或168位。 3DES加密处理速度慢,密钥计算时间长,加密效率不高。
3. AES数据加密算法(推荐)
Advanced Encryption Standard,高级数据加密标准,AES算法可以有效对抗针对DES的攻击算法。
密钥建立时间短、灵敏度好、内存要求低、安全性高
下面是三种加密算法DES/3DES/AES的比较:
4. 异或加密
在XOR运算中,可以得到一个字符(或值)。
这种加密算法比较简单,只是将明文转换成难以破译的密文。破解复杂度完全取决于私钥的长度。
三、非对称加密算法
公钥密码术也称为非对称密码术,这意味着有两个不同的密钥:公钥Pu和私钥Pr。公钥通常用于加密明文M。只有私钥才能解密加密密钥。如果用文本C、E、D分别表示加密算法和解密算法,则
C=E(M, Pu); //加密公式,M为明文,C为密文,
M=D(C, Pr); //解码公式
传统的对称加密要求双方共享相同的密钥,通信的安全性高度依赖于双方对密钥的正确管理。公钥密码学的发明是密码学最重要的里程碑之一,它从数学角度保证了通信的安全性。公钥密码系统主要分为三类:
加密/解密:表示发送者使用接收者的公钥对消息进行加密(私钥由接收者生成并发送给发送者)。
数字签名: 数字签名。发送方使用公钥对消息摘要进行加密并生成保证消息完整性和真实性的签名。
Key Exchange: 安全的密钥交换。通常用于交换对称加密的密钥(Diffie-Hellman 密钥交换算法)。
1.RSA加密
由于该算法基于欧拉函数,因此这里不再详细讨论。
这个算法非常可靠,而且密钥越长越难破解。根据已发表的文献,有史以来破解的最长RSA 密钥为768 个二进制位。换句话说,超过768 位的密钥无法被破解(分解大数的计算量特别大,至少没有人公开宣布过)。因此,1024 位RSA 密钥本质上是安全的,而2048 位密钥则被认为非常安全。
具体原理是公私钥生成、加密和解密的过程。
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.htm
5.模逆元/RSA算法原理/看云
2.SSL/TLS协议
具体来说,SSL/TLS 不是一种算法,而是一种用于保护通信的协议。当然,也会用到相关的密码算法,比如非对称密码算法、数字证书、HD密钥交换算法等。 https主要使用该协议来传输网络数据。
从上图可以大致了解该协议的通信流程。上述过程的目的只是为了获得一个相对安全的会话密钥。当然,这个密钥必须与客户端随机+服务器随机+permaster Secret一起生成,并且非常安全。会话密钥用于后续通信中数据的对称加密。 双方获得会话密钥后,通过HTTP协议发送数据。会话密钥用于加密通过HTTP 发送的内容。
SSL/TLS的详细解释可以参考阮一峰博客上的链接。
SSL/TLS协议工作机制概述- 阮一峰的博客
SSL/TLS协议图 阮一峰的博客
TOTP
TOTP的正式名称是“基于时间的一次性密码”。它被认为是可靠的解决方案,并包含在国际标准RFC6238 中。
步骤如下:
步骤1:当用户开启双因素身份验证时,服务器生成密钥。
步骤2:服务器要求用户扫描二维码(或使用其他方式)将密钥保存到用户手机中。即服务器和用户手机拥有相同的密钥。
第四步,服务器还使用密钥和当前时间戳生成哈希,并将其与用户提交的哈希进行比较。只要两者不一致,登录就会被拒绝。
请注意,密钥必须与您的手机绑定。一旦用户更换手机,就必须生成全新的密钥。
算法原理:
TC=下限((unixtime(now) unixtime(T0))/TS)
上式中,TC代表时间计数器,unixtime(now)是当前的Unix时间戳,unixtime(T0)是约定的起始时间戳。默认值为0(1970 年1 月1 日)。 TS 是哈希生命周期长度,默认为30 秒。因此,上式的形式为:
TC=下限(unixtime(当前)/30)
因此,30秒内TC值是相同的。前提是服务器和手机时间必须同步。
然后就可以计算哈希值了。
TOTP=哈希(私钥,TC)
TOTP 有硬件生成器和软件生成器,两者都使用上述算法。
数字签名过程(防止公钥被伪造 ):
什么是数字签名? – 阮一峰的博客
1.通过公钥和私钥进行加密通信,因此保证了发送信息的私密性,因为发送者发送的内容只能通过私钥打开。
2. 第三方可以向发送者提供伪造的公钥,拦截正在发送的信息,并使用自己的私钥对其进行解密。 HTTPS协议中引入的CA(证书颁发机构)可以成功解决这个问题。证书中心使用自己的私钥来加密公钥和发送给您的一些信息。发送者可以使用证书中的公钥来解密证书中包含他们需要发送的公钥的信息。 (目前认为证书信息是正确的,一般证书中心都是由比较可靠的机构颁发的。)
如果你在Chrome中打开百度网页时按F12,百度的证书就会出现在安全菜单栏中。证书包括颁发者、颁发者、公钥、有效期等信息。
a) 客户端向服务器发送加密请求。
b) 服务器用自己的私钥对网页进行加密,然后连同自己的数字证书一起发送给客户端。
c) 客户端(浏览器)上的“证书管理器”有一个“受信任的根证书颁发机构”列表。客户端使用此列表来检查它是否具有解锁数字证书的公钥。
如何在Android上使用https发送请求
网上大部分关于使用https的文章都是讲浏览器如何通过签名进行验证:浏览器存储并验证各个网站CA认证中心颁发的数字签名。那么问题来了,客户端与服务器握手完成后,客户端如何知道服务器发送的公钥及相关信息没有被第三方篡改((对应图c)。事实上,客户端必须提前导入CA证书,并在发出请求时添加相关证书信息才能完成https请求和验证。
Android端实现https请求的具体流程:https://developer.android.com/training/articles/security-ssl
客户端添加证书实现。
InputStream=getAssets().open(\’srca.cer\’);
私有SSLSocketFactory getSslSocketFactory(InputStream. 证书){
尝试{
CertificateFactory 证书工厂=CertificateFactory.getInstance(\’X.509\’);
KeyStore keyStore=KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
整数索引=0;
(InputStream证书:证书)
{
字符串证书别名=Integer.toString(index++);
keyStore.setCertificateEntry(certificateAlias,certificateFactory.generateCertificate(证书));
如果(证书!=null)
证书.close();
}
SSLContext sslContext=SSLContext.getInstance(\’TLS\’);
TrustManagerFactory trustManagerFactory=
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
sslContext.init
(
无效的,
trustManagerFactory.getTrustManagers(),
newSecureRandom()
);
返回sslContext.getSocketFactory()。
}catch(异常e){
}
返回空值。
}
创建HttpsURLConnection后,设置证书信息并发送请求。
httpsConn.setSSLSocketFactory(sslSocketFactory);
http网络请求令牌
HTTP 协议的无状态特性意味着您的程序必须验证每个请求以识别客户端的身份。那么如何才能只登录一次并从此以后一直登录呢?
1. 用户登录验证成功后,返回token给客户端。
2. 客户端收到数据后,将其存储在客户端上。
3. 客户端每次访问API 时都会向服务器发送一个令牌。
4. 服务器使用过滤器验证。如果验证成功,则返回请求数据;如果验证失败,则返回错误代码。
我在这里有一个问题。服务器如何知道它持有的令牌是用户的令牌而不是后续添加的令牌?
签名的实际应用
现在有三个参数(封装在Data类中的A、B、C)需要发送到服务器。那么如何防止这三项数据被其他用户伪造提交呢?这三个数据都是符号(String类型)。
客户端签名生成算法:
第一步:字典将三个参数名称(事先与服务器约定好的发送变量名称)排序并拼接成字符串StringA(key1=value1key2=value2key3=value3)。该字符串遵循指定的规则。
步骤2:在stringA的末尾加入私钥(只有服务器和客户端知道,第三方无法获取,也是签名的密钥),得到finalStringA。
第三部分:对FinalStringA进行MD5计算,将字符数组转换为十六进制字符串。
至此,符号生成过程结束。
根据Data和Key的三个参数A、B、C的值生成代码后,将代码值赋给Data的符号。将数据转换为JSONObject格式,然后转换为字符数组
通过HttpURLConnection 发送到服务器。服务器获得A、B、C的值后,通过同样的算法生成签名。如果签名与客户发送的签名不同,则提交内容可能被第三方伪造。
此签名可防止第三方伪造数据与服务器通信。 (具体流程如下图所示)
但问题来了。如果其他人员获取了通信密钥的秘密,则客户端代码(即使位于本机层)在不安全通信的情况下也有可能伪造数据。级别,加密措施是足够的。
补货:
非对称加密的过程主要包括以下步骤: 12
生成密钥对:首先,您需要生成一个密钥对,其中包括公钥和私钥。公钥用于加密数据,私钥用于解密数据。公钥可供任何人使用,但私钥仅由接收者拥有。
加密数据:发送数据时,发送方使用接收方的公钥对其进行加密。该算法称为非对称加密算法,因为加密和解密使用两个不同的密钥。
解密数据:接收者收到加密数据后,使用自己的私钥解密数据。只有拥有相应私钥的人才能解密公钥加密的数据,保证数据安全。
利用非对称密码算法实现秘密信息交换的基本过程是甲方生成一对密钥,将其中一个作为公钥公开给另一方,乙方使用该公钥来交换秘密信息。加密的信息被发送给甲方,甲方使用其存储的另一个私钥对其进行解密。非对称加密算法更安全,并且不需要最终用户交换密钥,但加密和解密需要更长的时间,因此不适合加密文件和仅适合加密少量数据。
在实际应用中,非对称加密通常是与其他加密技术结合使用,比如使用RSA的公钥加密AES密钥,然后使用AES加密请求数据就可以了。这种方法的组合既保证了安全性,又提高了加解密的效率。
#以上关于对称(DES/AES)加密和非对称(RSA/SSL/数字证书)加密介绍及实际应用的相关内容摘自网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93950.html