非对称加解密:公钥、私钥和证书
参考:
https://blog.csdn.net/qq_25933249/article/details/100065093
https://www.cnblogs.com/imteck4713/p/12016313.html(https用的是对称加密还是非对称加密)
https://itpika.com/2019/09/24/go/library-rsa (golang标准库crypto/rsa举例)
理解公钥和私钥首先要区分加密和认证这两个概念!
加密和认证
加密是将数据资料加密,使别人即使获取加密数据也无法获取正确的资料内容,重点在于数据的安全性。
认证是是确定数据的真实发送方,使别人无法伪造或冒充,重点在于用户的真实性。
公钥和私钥
要达到数据安全传输的目的,必须发送方和接收方都持有对方的公钥和自己私钥,即任意一方持有自己的私钥和对方的公钥。
秘钥包括公钥和私钥:具有对应关系,一起生成!公钥加密私钥解密,私钥加密公钥解密。
用途
公钥:是公布出去给别人用的,可以被很多人获取。用来加解密和验签
私钥:只能自己持有,并且不可以被其他人知道,用来加解密和签名
为了数据的安全性:数据加密
A需要使用B的公钥来给数据加密,这样只有B的私钥才可以解密数据,这样保证了数据的安全性
为了保证数据发送方的真实性:签名认证
A需要使用自己的私钥来个数据加密,这样其他人用A的公钥进行解密,由于只有A私钥加密的数据,A的公钥才能解密,所以他人用A的公钥若能解密此数据,则证实数据是由A发送的,
若不能解密,则证明数据不是用A的私钥加密,即不是A发送的,这样保证了送法的真实性。
实战:
实现:php
生成公钥和私钥
$config = array( "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA, ); // 创建密钥资源 $res = openssl_pkey_new($config); // 提取私钥 openssl_pkey_export($res, $privKey); // 提取公钥 $pubKey = openssl_pkey_get_details($res); $pubKey = $pubKey["key"]; // 打印私钥和公钥 echo "私钥:\n"; echo $privKey; echo "\n公钥:\n"; echo $pubKey;
使用公钥和私钥,加解密
参考:https://www.cnblogs.com/huyihao/p/6082765.html
#私钥加密公钥解密 // 生成密钥资源id $pi_key = openssl_pkey_get_private($private_key); $pu_key = openssl_pkey_get_public($public_key); // 私钥加密 $encrypted = ‘’; openssl_private_encrypt($data, $encrypted, $pi_key); // 转码,这里的$encrypted就是私钥加密的字符串 $encrypted = base64_encode($encrypted); // 公钥解密,$decrypted即为公钥解密后私钥加密前的明文 $decrypted = ‘’; $encrypted = base64_decode($encrypted); openssl_public_decrypt($encrypted, $decrypted, $pu_key); #公钥加密,私钥解密 // 生成密钥资源id $pi_key = openssl_pkey_get_private($private_key); $pu_key = openssl_pkey_get_public($public_key); // 公钥加密 $encrypted = ‘’; openssl_public_encrypt($data, $encrypted, $pu_key); // 转码,这里的$encrypted就是公钥加密的字符串 $encrypted = base64_encode($encrypted); // 私钥解密,$decrypted即为私钥解密后公钥加密前的明文 $decrypted = ‘’; $encrypted = base64_decode($encrypted); openssl_private_decrypt($encrypted, $decrypted, $pu_key);
golang版本待补充
证书:
证书是为公钥做认证,为了使公钥真实可信,防止他人伪造公钥;证书颁发 机构(证书中心CA)会用自己的私钥对用户的公钥和相关信息进行加密,生成”数字证书“,然后证书中心会公布自己的公钥给所有人,用来让用户使用此公钥验证”数字证书“是否由CA颁发,即是否真实可信,产生证书的场景:
注意:
以上前提必须是CA是可信赖的,CA证书是不可伪造的!
上边A给B发送数据只实现了身份确认,数据未被修改过,但是没有保证数据是安全的,即数据传输的过程中可以被第三人看到数据内容,要想实现安全的数据传输,A还要做进一步工作,即用B的公钥给数据加密,这样只有B才可以解密,从而保证了数据的安全性。
为什么需要证书
场景一:当A和B进行通信的时候,A使用B的共钥B.PUB对消息M进行加密,B在收到A发送的消息后,使用自己的私钥B.PRi对消息进行解密。
但是场景一有一个问题,就是有一个C可能假冒A向B发送消息,所以需要对A进行身份校验,这就需要对发送者进行身份认证。使用方式如下
场景二:A向B发送消息M,首先A使用自己的私钥A.PRI对M进行加密,再使用B.PUB加密,然后将消息发送给B,B收到消息M后,需要使用自己的私钥B.PRI对M进行第一次解密,再使用A的公钥A.PUB进行解密,如果能获取明文,说明确实是A发送的消息,这样反向使用称为数字签名。
场景二的问题在于,B无法保证获取到正确的A的公钥,如果在协商公钥过程中,C拦截了消息,并把自己的公钥发给B,那么B就会认为C就是A,导致消息泄露。
为了解决场景二的问题,就引入了证书。
场景三:A与B进行通信,B为服务端,那么B首先需要到CA(权威第三方中立机构)申请证书,CA将B的名称、公钥与CA用私钥生成的数字签名等信息携程证书颁发给B,A要与B通信时,B将自己的证书发给A,A对证书进行检查(是否过期,能否用CA的公钥验证签名等),确认无误后,就能够证明B的身份,安全的进行通信了
由上再次总结:
证书分为公钥证书和私钥证书,每个人的公钥,私钥证书不一样,但是肯定是一一对应的。
加密技术:公钥证书加密,私钥证书解密
签名技术:私钥证书加密,公钥证书解密
对于一方来说,持有对方公钥(即证书,因为公钥放在证书里),就可以验证对方身份,并且保证发送给对方数据的安全性。