zoukankan      html  css  js  c++  java
  • 加密、签名、证书基本概念

    1.非对称加密

    非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。

    公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。

    因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

    工作原理

    • A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
    • A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
    • A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
    • A将这个消息发给B(已经用B的公钥加密消息)。
    • B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。

    RSA算法

    RSA加密算法是一种非对称加密算法

    RSA是三位开发者姓氏开头字母拼在一起组成的。

    2.对称加密

    所谓对称,就是采用这种加密方法的双方使用方式同样的密钥进行加密和解密。

    密钥是控制加密及解密过程的指令。

    算法是一组规则,规定如何进行加密和解密。

    优缺点

    由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。

    加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题。

    工作原理

    • 数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。
    • 接收方收到密文后,若想解读原文,则需要使用加密密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。
    • 在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密。

    AES

    高级加密标准(英语:Advanced Encryption Standard,缩写:AES)

    这个标准用来替代原先的DES

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法

    AES属于对称加密方法

    3.密码散列函数

    密码散列函数(Cryptographic hash function),又译为加密散列函数,是散列函数(哈希函数)的一种。

    它被认为是一种单向函数,也就是说极其难以由散列函数输出的结果,回推输入的数据是什么。

    这种散列函数的输入数据,通常被称为消息(message),而它的输出结果,经常被称为消息摘要(message digest)或摘要(digest)。

    特点

    • 对于任何一个给定的消息,它都很容易就能运算出散列数值
    • 难以由一个已知的散列数值,去推算出原始的消息
    • 在不更动散列数值的前提下,修改消息内容是不可行的
    • 对于两个不同的消息,它不能给与相同的散列数值

    MD5

    MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数

    可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。

    SHA家族

    安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。

    能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。

    家族成员

    • SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512
    • SHA-1在许多安全协定中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec
    • SHA-1的安全性如今被密码学家严重质疑;后四者有时并称为SHA-2,至今尚未出现对SHA-2有效的攻击

    4.证书机制

    • 引入一个公正的第三方
    • 当某一方想要发布公钥时,它将自身的身份信息及公钥提交给这个第三方
    • 第三方对其身份进行证实,如果没有问题,则将其信息和公钥打包成为证书(Certificate)
    • 而这个公正的第三方,就是常说的证书颁发机构(Certificate Authority)
    • 当我们需要获取公钥时,只需要获得其证书,然后从中提取出公钥就可以了

    解决问题:

    通常情况下,获取外部平台的公钥时,除非对方手把手将公钥交给我们,否则公钥在网络中传递时,可能被篡改

    5.数据安全传输条件

    数据传输安全要满足的要求:

    • 消息的发送方能够确定消息只有预期的接收方可以解密(不保证第三方无法获得,但保证第三方无法解密)。
    • 消息的接收方可以确定消息是由谁发送的(消息的接收方可以确定消息的发送方)。
    • 消息的接收方可以确定消息在途中没有被篡改过(必须确认消息的完整性)。

    如何实现?

    假设有两组四个密钥

    A的公钥(PUB_A),A的私钥(PRI_A);B的公钥(PUB_B),B的私钥(PRI_B)

    公钥一般用来加密,私钥用来签名

    A发送消息

    • 利用加密散列函数(SHA-2、MD5)对要发送的消息进行运算,单向生成消息摘要
    • A用自己的私钥(PRI_A)对消息摘要进行签名
    • A用B的公钥(PUB_B)对消息和签名后的消息摘要进行加密

    B接受消息

    • B用自己的私钥(PRI_B)解密A用B的公钥(PUB_B)加密的内容
    • 解密后的内容分为两部分,一部分是消息,一部分是签名后的消息摘要
    • B用A的公钥(PUB_A)解签A用A自己私钥(PRI_A)签的签名
    • 对解密后的消息,进行加密散列函数运算,生成新的消息摘要,对比解签后的消息摘要,判断是否一致

    非对称加密尽可能的保证了,消息在网络传输过程中,即使被截取,也无法被解密;

    对消息摘要解签的过程,要用到发送方的公钥,这样也就确定了消息的发送方;

    消息摘要的前后对比,保证了消息的完整性。

    非对称加密是一种很耗时的操作,而对称加密效率虽然高,但不安全。

    我们可以结合使用。

    利用非对称加密,加密(签名)消息摘要和对称加密中的密钥;利用对称加密方式,加密消息数据

    偷了一幅图:

    这篇博客写的很详细,图偷他的:

    加密、签名和SSL握手机制细节https://www.cnblogs.com/f-ck-need-u/p/6089523.html

    图中利用私钥,加密摘要信息生成数字签名,就是 签名 的过程。

    参考

    加密和签名的区别:https://blog.csdn.net/youshaoduo/article/details/78476578

    签名、加密、证书的基本原理和理解:https://www.cnblogs.com/Caersi/p/6720789.html

    加密、签名和SSL握手机制细节https://www.cnblogs.com/f-ck-need-u/p/6089523.html

    还有一篇,关于前后端代码层面的,可以看一下:

    前后端API交互如何保证数据安全性https://mp.weixin.qq.com/s?__biz=MzIwMDY0Nzk2Mw==&mid=2650319474&idx=1&sn=58d93748e1fce98a49378f611584dac2&chksm=8ef5fe06b982771076064fdca41117a5aadf782f7a2cecb7ca1b6208fadbe4103ade35bafdf7&scene=21#wechat_redirect

    API数据加密框架monkey-api-encrypthttps://mp.weixin.qq.com/s?__biz=MzIwMDY0Nzk2Mw==&mid=2650319952&idx=1&sn=7cc80ab7ed6f3e1df48c23b245372ba8&chksm=8ef5f824b9827132f60d34dbe6915fe0528a2c56a8554b8f49ac797f372822d212f4f2a5f642&mpshare=1&scene=1&srcid=01163FLdZcK0cq47tY4ZG0Da&pass_ticket=Sn9gxTq46KCLz60J3Cs6MnKXjxGSsgKRe48Qz7idTxoU200Ohd5V420i5WMYpEWP#rd

  • 相关阅读:
    B树与B+详解
    SQLite占用资源少原因
    iOS SQLite详解
    YTKNetwork网络封装
    YTKNetwork源码详解
    AFNetworking封装-项目使用
    iOS网络请求-AFNetworking源码解析
    PHP 不使用第三个变量实现交换两个变量的值
    PHP public private protected 三种修饰符的区别
    PHP 汉字转拼音
  • 原文地址:https://www.cnblogs.com/feng-jq/p/10282060.html
Copyright © 2011-2022 走看看