Ⅰ 公钥与私钥用于加解密和签名
公钥:公开持有,每个人都可以获得。
私钥:个人持有,需要保密不能泄露。
公钥加密,私钥解密
信息从公钥持有者中的某一个向私钥持有者发送。
加解密是为了让通信的第三方无法获取消息内容。
私钥签名,公钥验签
信息从私钥持有者向公钥持有者中的某一个发送。
签名是为了证明消息发送者的身份合法,即是“我”本人而不是其他人冒充我发送的消息。(但这个消息可能是公开的,如果希望加密发送,则需要另外一对儿公钥和私钥反方向持有,完成加解密过程)
私钥和公钥是一对,谁都可以加解密,只是谁加密谁解密是看情景来用的:
第一种情景是签名,使用私钥加密,公钥解密,用于让所有公钥所有者验证私钥所有者的身份并且用来防止私钥所有者发布的内容被篡改.但是不用来保证内容不被他人获得。
第二种情景是加密,用公钥加密,私钥解密,用于向公钥所有者发布信息,这个信息可能被他人篡改,但是无法被他人获得。
比如加密情景:
如果甲想给乙发一个安全的保密的数据,那么应该甲乙各自有一个私钥,甲先用乙的公钥加密这段数据,再用自己的私钥加密这段加密后的数据.最后再发给乙,这样确保了内容即不会被读取,也不会被篡改。
英文版: http://www.youdzone.com/signature.html
中文版: http://www.blogjava.net/yxhxj2006/archive/2012/10/15/389547.html
https://www.hu.com/question/25912483
Ⅱ 鏁板瓧绛惧悕閲囩敤镄勬槸浠涔埚姞瀵嗘妧链
鏁板瓧绛惧悕閲囩敤镄勬槸闱炲圭О锷犲瘑鎶链銆
闱炲圭О锷犲瘑鎶链锛屼篃绉颁负鍏阍ュ姞瀵嗭纴浣跨敤涓や釜瀵嗛挜杩涜屽姞瀵嗗拰瑙e瘑镎崭綔锛屽垎鍒鏄鍏阍ュ拰绉侀挜銆傚叕阍ユ槸鍏寮镄勶纴浠讳綍浜洪兘鍙浠ヤ娇鐢锛岃岀侀挜鏄淇濆瘑镄勶纴鍙链夊瘑阍ョ殑涓讳汉镓嶈兘浣跨敤銆傝繖绉嶅姞瀵嗘柟寮忕殑涓昏佷紭镣规槸瀹夊叏镐ч珮锛屽洜涓虹侀挜鍙链夊瘑阍ョ殑涓讳汉鎺屾彙锛屽嵆浣垮叕阍ヨ鏀诲嚮钥呰幏鍙栵纴涔熸棤娉曡В瀵嗗嚭铡熷嬩俊鎭銆
鍦ㄦ暟瀛楃惧悕涓锛屽彂阃佹柟浣跨敤镊宸辩殑绉侀挜瀵逛俊鎭杩涜屽姞瀵嗭纴鐢熸垚鏁板瓧绛惧悕锛岀劧钖庡皢鏁板瓧绛惧悕鍜屼俊鎭涓璧峰彂阃佺粰鎺ユ敹鏂广傛帴鏀舵柟浣跨敤鍙戦佹柟镄勫叕阍ュ规暟瀛楃惧悕杩涜岃В瀵嗭纴楠岃瘉淇℃伅镄勫畬鏁存у拰鐪熷疄镐с傚洜涓虹侀挜鍙链夊彂阃佹柟鎺屾彙锛屽洜姝ゅ彧链夊彂阃佹柟镓嶈兘鐢熸垚链夋晥镄勬暟瀛楃惧悕锛岃繖镙峰彲浠ョ‘淇濅俊鎭镄勬潵婧愬拰瀹屾暣镐с
涓句釜渚嫔瓙锛屽亣璁惧皬鏄庤佺粰灏忕孩鍙戦佷竴𨱒″姞瀵嗕俊鎭銆傚皬鏄庝娇鐢ㄨ嚜宸辩殑绉侀挜瀵逛俊鎭杩涜屽姞瀵嗭纴鐢熸垚鏁板瓧绛惧悕锛岀劧钖庡皢鏁板瓧绛惧悕鍜屼俊鎭涓璧峰彂阃佺粰灏忕孩銆傚皬绾㈡敹鍒颁俊鎭钖庯纴浣跨敤灏忔槑镄勫叕阍ュ规暟瀛楃惧悕杩涜岃В瀵嗭纴楠岃瘉淇℃伅镄勫畬鏁存у拰鐪熷疄镐с傚傛灉瑙e瘑鎴愬姛锛岃存槑淇℃伅纭瀹炴槸灏忔槑鍙戦佺殑锛屽苟涓旀病链夊湪浼犺緭杩囩▼涓琚绡℃敼銆
镐讳箣锛屾暟瀛楃惧悕閲囩敤镄勬槸闱炲圭О锷犲瘑鎶链锛屼娇鐢ㄥ叕阍ュ拰绉侀挜杩涜屽姞瀵嗗拰瑙e瘑镎崭綔锛屽彲浠ョ‘淇濅俊鎭镄勬潵婧愬拰瀹屾暣镐с
Ⅲ 一文弄懂关于证书,签名,ssl,android包签名机制。
所有的概念都基于一个非常重要的基础:
rsa 非对称加密算法 :
先感受下几个概念
PKI。
PKI是公钥基础设施(Public Key Infrastructure) 包括PKI策略、软硬件系统、证书机构CA、注册机构RA、证书发布系统和PKI应用等。
我们关注就俩东西: PKCS 证书机构CA 。前者是定义加密算法,签名,证书相关的各种事情采用的协议。后者可以为我们颁发权威的证书。
PKCS :
PKCS(The Public-Key Cryptography Standards )是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。RSA算法可以做加密、解密、签名、验证,还有RSA的密钥对存储。这些都需要标准来规范,如何输入,如何输出,如何存储等。
PKCS。全称是公钥密码学标准, 目前共发布过 15 个标准,这些标准都是协议。总结一下 就是对加密算法,签名,证书协议的描述。下面列举一些常用的协议,这些协议在本文都会对应上。
这些协议具体的实现就体现在openssl等工具中, 以及jdk工具keytool jdk java第三方库bouncycastle。
比如用openssl 如何生成公/私钥(PKCS#1)、签名(PKCS#1 )、签名请求文件(KCS#10)、 带口令的私钥(PKCS#8)。 含私钥的证书(PKCS#12)、证书库(PKCS#12)
其中涉及到算法的基础协议PKCS#1等,由于涉及到密码学原理所以我们并不需要深究它,只要知道怎么做就可以了。
现实中我们要解决这样一种情况:
客户端和服务器之间的数据要进行加密。需要两个达成同一个对称秘钥加密才行,那么这个秘钥如何生成,并在两边都能拿到,并保证传输过程中不被泄露。 这就用到非对称加密了。 后续的传输,就能用这个 对称秘钥来加密和解密了。
还有这样一个问题:
就是客户端如何判断服务端是否是合法的服务端。这就需要服务端有个id来证明它,而这个id 就是证书,而且必须是权威机构颁发的才能算是合法的。
因为客户端即浏览器,认定证书合法的规则必须通过第三方来确认 即ca颁发的证书。否则就我可能进了一个假网站。
而这两个问题 都是ssl协议要解决的内容。
所以ssl协议做了两件事情,一是验证身份,二是协商对称秘钥,并安全的传输。 而实现这个过程的关键数据模型就是证书, 通过证书中的ca对证书的签名,实现了身份验证,通过证书中的公钥,实现对对称秘钥加密,从而实现数据保密。 其实还顺手做了一件事情就是通过解密签名比对hash,保证了数据完整性。
明白ssl协议 首先明白几个重要的概念:
证书: 顾名思义就是提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,由权威公正的第三方机构,即CA(例如中国各地方的CA公司)中心签发的证书, 就是可以认定是合法身份的。客户端不需要证书。 证书是用来验证服务端的。
一般的证书都是x509格式证书,这是一种标准的证书,可以和其他证书类型互相转换。完整来说证书包含,证书的内容,包括 版本号, 证书序列号, hash算法, 发行者名称,有效期, 公钥算法,公钥,签名(证书原文以及原文hash一起签名)而这个内容以及格式 都是标准化的,即x509格式 是一种标准的格式。
签名: 就用私钥对一段数据进行加密,得到的密文。 这一段数据在证书的应用上就是 对证书原文+原文hash进行签名。
谁签的名,就是用谁的私钥进行加密。就像身份证一样, 合法的身份证我们都依据是政府签的,才不是假证, 那就是浏览器会有政府的公钥,通过校验(解密)签名,如果能够解密,就可以确定这个就是政府的签名。就对了。
hash算法 :对原始数据进行某种形式的信息提取,被提取出的信息就被称作原始数据的消息摘要。比如,MD5和SHA-1及其大量的变体。 hash算法具有不可逆性,无法从摘要中恢复出任何的原始消息。长度总是固定的。MD5算法摘要的消息有128个比特位,SHA-1算法摘要的消息最终有160比特位的输出。
ca机构: 权威证书颁发机构,浏览器存有ca的公钥,浏览器以此公钥来验证服务端证书的合法性。
证书的获取: 生成证书申请文件.csr(涉及到PKCS#10定义的规范)后向ca机构申请。 或者自己直接通过生成私钥就可以一步到位生成自签名证书。 自签名证书就是用自己的私钥来签名证书。
那么为了体现到 证书身份认证、数据完整、保密性三大特性 ,证书的简化模型可以认为包含以下两个要素:服务器公钥,ca的签名(被ca私钥加密过的证书原文+原文hash),
身份认证:
浏览器存有ca公钥,用ca公钥解密网站发给你的证书中的签名。如果能解密,说明该证书由ca颁发,证书合法。 否则浏览器就会报警告,问你是否信任这个证书,也就是这个网站。这时候的证书可以是任何人签发的,可以自己签发的。 但是中间人攻击。 完全伪造新的证书, 这就没有办法了。 所以还是信任证书的时候要谨慎。
数据完整:
如果你信任该证书的话,这时候就会用证书中的公钥去解密签名,如果是ca签发的证书,那么之前就已经通过ca的公钥去解密签名了。 然后得到证书hash,然后在浏览器重新对证书做hash,两者比对一致的话,说明证书数据没有被篡改。
保密性:
使用证书的公钥对对称秘钥加密保证传输安全,对称秘钥生成后,后续的传输会通过对称秘钥来在服务端和客户端的加解密。
那么ssl协议的具体过程就是:
4.网站接收浏览器发来的数据之后 使用自己的私钥校验签名,并对原文进行hash 与解密出的hash 做比对检查完整性。然后发送编码改变通知,服务器握手结束通知(所有内容做hash )。 发送给客户端校验。
5 客户端校验,校验成功后,之后就用 对称秘钥进行通信了。
总共的过程是 c-s-c- s-c 四次握手。
四次握手简单来说分别是:
1.请求获取证书
2.服务端返回证书,客户端验证了证书的合法性和完整性,同时生成了对称秘钥。
3.客户端把加密的 对称秘钥发给服务器。服务器检查真实性和完整性。
4.服务端返回握手结束通知,客户端再检查一次真实性和完整性。
前两次握手是明文, 后两次握手是密文。 所以都要检查身份真实性和数据完整性。
ca的作用:
ca起到一个权威中间人的角色,如果脱离了ca, 那么证书还是证书,还能加密,保证数据完整性。 但是无法应用在客户端去认定服务器身份合法这个场景下。
下面就详细说下 脱离了ca签发的证书的应用:
自签名证书:
证书如果没有权威机构的签名,就是没有权威机构给你签发身份证。 那么这时候身份认证的场景变了。
这时候的认证场景就变成了,不再是某个官方权威说了算,而是假设第一次碰到这个证书,会认为,这个证书与之捆绑的实体之间是合法的并做记录。如果当这个实体下次捆绑了另一个证书,那么就是非法的。
这种情况常用于android中安装和校验app的时候,会先假设第一次安装的是合法的应用,认定这个app证书中的公钥是合法的公钥。然后通过自签名的证书,校验签名,就能实现后续安装是否合法以及完整性。
android中的如何对app进行身份认定和不被篡改:
android系统在安装app时候会进行校验applicationId,applicationId 不同会认定为不同应用。相同应用,第二次安装会校验证书是否和之前app的证书相同,如果相同则两个包很可能来自同一个身份。 如果证书不同,也就是该包被另一个身份用自己的私钥重新签名过,就会拒绝安装。 然后通过公钥来解密签名,如果能解密,说明身份是ok的。否则拒绝安装。比对解密签名后的hash 与apk包内的cert.sf文件(该文件是apk内所有文件生成的hash文件)是否一致,如果相同则认定为没有被篡改。
android在提交应用商店的问题:
应用商店也会校验 后续的上传和第一次上传时的证书,以及类似上述的后续的一系列校验。防止合法的开发者平台被盗后,上传非法应用。
android在接入第三方sdk的问题:
接入第三方sdk 会提交applicationId 和 sha1 值。 这个sha1值就是对 证书原文的签名后的sha1,也就是证书指纹。这个证书是证书库里最初的那个证书(x509格式),而不是对apk签名后生成的证书(PKCS#7)。一般的证书签名的主体是证书原文本身,而对apk签名还额外会对apk所有文件生成的hash值文件(cert.sf)进行一次签名。
第三方平台会记录 applicationId 与sha1 的对应关系。 当有假冒app试图接入时候,由于会对app内的PKCS#7证书转换为原始的x509格式证书,重新生成sha1值,与用户提交sha1 比对, 如果相同则说明证书很可能是ok的。 因为sha1就是证书的指纹。 之后就会通过证书中的公钥来校验签名,从而最终确认身份合法性以及信息完整性。
第三方平台之所以需要用户去提交证书指纹sha1值,多了这一步,就意味着你的证书是可以更换的,一旦更换了证书,就必须提交新的指纹给我,然后我来做匹配。而应用商店没有这个功能, 一旦你的证书的私钥丢了, 那就必须重新建一个新的app。
总结来看证书的身份认定机制:
在ssl协议下,这种场景是 浏览器用于认定合法的服务器身份。 在自签名证书下,需要用户选择是否信任该证书。
在android app采用自签名证书的场景下, 证书起到了 假设第一次的证书合法,公钥合法,后续如果证书不一致或不能够完成签名校验,就是非法。
证书库:
证书库应该满足PKCS#12协议。 但是jdk提供了制作证书的工具keytool 可以生成keystore类型的证书库,后缀为jks。 keystore pk12可以通过keytool命令互相转换。
证书库是个证书的容器, 可以用来创建数字证书。 在keystore证书库中,所有的数字证书是以一条一条(采用别名alias区别)的形式存入证书库的。证书库中的证书格式为pk12,即包含私钥。 如果导出证书的话, 可以导出为x509不包含私钥的格式 或者pk12包含私钥的证书。 也可以也可以用-import参数加一个证书或证书链到信任证书。
android中一般都采用读取证书库的方式,通过证书库来创建一个证书,通过alias来区分。 所以在签名的时候,一个alias是一个证书,不同的alias是不同的证书,不要搞错了。
几个关系:
证书和非对称加密算法的关系:
证书代表一个身份的主体,包含了非对称秘钥体系中的公钥,以及用私钥对证书签名。这种组织结构,把非对称加密算法从加密的功能,拓宽到了用于身份认证,信息完整性上。这体现在了证书的作用。 本质还是利用了非对称加密算法的特性。
ssl协议和证书的关系。
因为证书解决了客户端对服务器的身份认证(自签名证书除外),同时也解决了加密,和信息完整性,所以ssl协议基于证书来实现。
Ⅳ RSA公钥、私钥、加密、签名区别
加密与签名是两种信息安全手段,RSA算法利用一对公钥和私钥实现。公钥是公开的,用于加密信息,确保只有持有私钥的人能解密,从而保护信息不被窃取,这被称为加密。相反,私钥用于签名,它加密信息以验证其完整性和发送者的身份,但同时,签名会暴露消息内容,不提供隐私保护。
为了更安全,推荐采用"一人一对公钥私钥"的方法。首先,双方各自保留自己的私钥和公开的公钥。发送者使用接收者的公钥加密信息(密文A),然后用自己的私钥对这个密文再次加密(密文B)。接收者收到后,先用发送者的公钥解密B,确认信息未被篡改,接着用自己私钥解密A获取原文。这种方法在保护信息不被第三方窃取的同时,也确保了消息的真实性。
需要注意的是,尽管公钥可以公开,但私钥的保密至关重要,因为它是验证和保护信息完整性的关键。通过这种方式,信息的完整性得以保护,但隐私性仍然受到一定程度的影响。