秘钥与数字证书

一 秘钥

秘钥(key)通过加密算法(key algorithms)生成。加密算法分为两类:对称秘钥加密算法(symmetric key algorithms)和非对称秘钥加密算法(asymmetric key algorithms)。前者属于单钥加密(private key cryptography),只产生一把秘钥,由该秘钥加密和解密,拥有秘钥的双方都需要保管好秘钥,因此秘钥容易被泄漏出去;而后者属于双钥加密(public key cryptography),产生两把秘钥,一把公开的公钥(public key),一把不公开的私钥(private key),只需要保管好私钥,安全性大大提高了 。

在双钥加密的情况下

  • 公钥和私钥一一对应,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。
  • 所有的(公钥, 私钥)对都是不同的。
  • 公钥可以解开私钥加密的信息,反之亦然;但不能解开自己加密的信息。公钥一般用于加密,私钥一般用于解密。
  • 秘钥对生成后,不能从公钥推出私钥,在原理上也不能从私钥推出公钥,但是由于一般私钥中也会保存公钥的信息,因此可行,如ssh-keygen -y

目前,通用的单钥加密算法为DES(Data Encryption Standard),通用的双钥加密算法为RSA( Rivest-Shamir-Adleman),都产生于上个世纪70年代。单钥加密算法还有AES(微信公众号正在使用),双钥加密算法还有dsa,ecdsa,ed25519等。

二 数字证书

浏览器与服务器使用https通信时,通信过程如下(这里的步骤2是错误的):

  1. 浏览器向服务器发出请求。
  2. 服务器发送公钥给浏览器,之后双方都通过秘钥对数据加密和解密。
  3. 服务器将浏览器请求的数据通过哈希函数,产生摘要(digest),然后用私钥对摘要进行加密,产生数字签名(signature),并将数据连同数字签名发给浏览器。常用的生成摘要的算法如md5,参考:零碎知识4.6小节
  4. 浏览器使用公钥解密数字签名,得到摘要,然后也对数据进行哈希运行产生摘要,将两者对比,判断是否来自于要访问的服务器,然后执行自己的操作。
  5. 两者继续通过秘钥通信

但是问题来了,步骤1、2中,浏览器请求服务器时,请求被hacker拦截,并模拟服务器发送自己的公钥给浏览器,于是hacker可以通过自己的私钥来骗取浏览器的信任,容易窃取到浏览器用户的信息。这就是著名的中间人攻击

也就是说,浏览器获得的公钥不可信。为了解决此问题,引入了大家都信任的数字证书认证机构(CA) ,CA用自己的秘钥将服务器一些相关信息和公钥加密起来形成数字证书。于是步骤2中,服务器不再发送公钥给浏览器,而是发送数字证书。浏览器一般会保存被信任的所有认证机构(CA)的公钥,用于解密收到的数字证书,得到服务器的公钥,再进行步骤4进行验证。

只要CA的私钥不被泄漏,hacker就不能伪造数字证书,从而不能将自己的公钥传给浏览器。即使hacker获取了其他服务器的私钥和数字证书,拦截浏览器请求交给它该数字证书,浏览器也判断该证书代表的服务器不是自己访问的,因为数字证书中还含有与服务器相关的信息。

这就是https能够保证数据安全的原因。

参考

密码学笔记
数字签名是什么?
Key (cryptography)
ssh-keygen

鸿蒙开发证书秘钥的获取、使用及相关信息如下: ### 获取方式 在 Generate Key 界面中,继续填写密钥信息后,点击 Generate Key and CSR 来获取。具体填写内容如下: - Alias:密钥的别名信息,用于标识密钥名称,需记住该别名,后续签名配置需要使用。 - Password:输入密钥对应的密码,密钥密码需要密钥库密码保持一致,需记住该密码,后续签名配置需要使用。 - Confirm Password:再次输入密钥密码。 - Validity:证书有效期,建议设置为 25 年及以上,覆盖应用的完整生命周期。 - Certificate:输入证书基本信息,如组织、城市或地区、国家码等 [^3]。 ### 使用方法 HarmonyOS 通过数字证书 Profile 文件等签名信息来保证鸿蒙应用/元服务的完整性,鸿蒙应用/元服务如需上架则必须通过签名校验。因此,需要使用发布证书 Profile 文件对鸿蒙应用/元服务进行签名后才能发布 [^1]。 ### 相关信息 还可以使用代码获取正式应用签名证书的签名信息,示例代码如下: ```typescript import { bundleManager } from '@kit.AbilityKit'; import { hilog } from '@kit.PerformanceAnalysisKit'; import { BusinessError } from '@kit.BasicServicesKit'; let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO; try { bundleManager.getBundleInfoForSelf(bundleFlags).then((data) => { hilog.info(0x0000, 'testTag', 'getBundleInfoForSelf successfully. Data: %{public}s', JSON.stringify(data)); //data里可以获取到signatureInfo,即应用的签名证书信息 }).catch((err: BusinessError) => { hilog.error(0x0000, 'testTag', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message); }); } catch (err) { // 生成2048位RSA秘钥 let message = (err as BusinessError).message; hilog.error(0x0000, 'testTag', 'getBundleInfoForSelf failed: %{public}s', message); } ``` 通过这段代码获取到 signatureInfo.appIdentifier,然后进行 MD5 处理,即可特定方法获取的值一致 [^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值