本文旨在深入探讨华为鸿蒙HarmonyOS Next系统(截止目前API12)的技术细节,基于实际开发实践进行总结。
主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。
本文为原创内容,任何形式的转载必须注明出处及原作者。
一、引言
在当今数字化时代,安全通信已然成为信息交互的基石。非对称密钥技术作为保障信息安全的关键手段,在安全通信领域中发挥着不可或缺的作用。与对称密钥不同,非对称密钥使用公钥和私钥这一对独特的“钥匙”,公钥可以公开,任何人都能使用它来加密信息,而私钥则被严格保密,只有拥有者才能使用它来解密信息。这种特性使得非对称密钥在身份认证、数据加密和数字签名等方面具有独特的优势,能够有效防止信息被窃取、篡改和伪造,为我们的数字生活提供了坚实的安全保障。接下来,我们将深入探讨 HarmonyOS Next 中如何生成非对称密钥对,以及不同算法和生成方式的特点与应用。
二、非对称密钥生成和转换规格
(二)指定规格方式差异与应用场景
- 字符串参数方式
- 这种方式简单直观,通过特定的字符串格式来描述所需生成的密钥规格。例如,对于 RSA 算法,使用“RSA 密钥类型|素数个数”的格式,如“RSA1024|PRIMES_2”表示生成 RSA1024 类型、素数个数为 2 的密钥。对于其他算法,如 ECC 的“ECC 密钥长度”格式(如“ECC256”)、SM2 的“SM2_密钥长度”格式(如“SM2_256”)等。这种方式适用于快速创建常见规格的密钥,在开发过程中,如果开发者对密钥规格有明确的需求且符合预定义的字符串格式,使用字符串参数可以方便快捷地生成密钥。例如,在一个简单的加密通信示例中,开发者可以直接使用“RSA2048|PRIMES_2”来生成一个用于加密会话密钥的 RSA 密钥对。 密钥参数方式
- 密钥参数方式则更加灵活和精确,它允许开发者通过详细的密钥参数来构建密钥。以 RSA 为例,需要指定模数(n)、公钥指数(pk)等参数;对于 ECC 算法,需要指定椭圆曲线的参数(如 p、a、b、g、n、h 等)以及公钥和私钥的值。这种方式适用于需要自定义密钥参数的高级场景,如在某些特定的安全协议实现中,根据协议要求精确构建符合标准的密钥。例如,在一个与特定安全标准兼容的应用中,开发者可能需要根据标准文档中定义的密钥参数,使用密钥参数指定方式来生成符合要求的 ECC 密钥对。三、指定 PEM 格式字符串数据转换非对称密钥对(ArkTS 示例)
(一)转换要求
- 公钥需满足 X.509 规范、PKCS#1 规范、PEM 编码格式。这意味着公钥的格式必须符合 X.509 标准中定义的结构,并且使用 PKCS#1 标准进行编码,同时以 PEM 格式进行封装,以便于在不同系统之间进行传输和存储。
私钥需满足 PKCS#8 规范、PKCS#1 规范、PEM 编码格式。私钥同样需要遵循特定的规范和格式要求,以确保其安全性和兼容性。PKCS#8 规范定义了私钥的存储和加密格式,与 PKCS#1 规范相结合,保证了私钥在不同应用中的正确使用。
(二)代码实现细节
首先,准备好符合要求的 PEM 格式字符串数据,包括公钥和私钥字符串。例如:
let priKeyPkcs1Str1024: string = "-----BEGIN RSA PRIVATE KEY-----\nMIICXQIBAAKBgQCwIN3mr21+N96ToxnVnaS+xyK9cNRAHiHGgrbjHw6RAj3V+l+W\nY68IhIe3DudVlzE9oMjeOQwkMkq//HCxNlIlFR6O6pa0mrXSwPRE7YKG97CeKk2g\nYOS8YEh8toAvm7xKbiLkXuuMlxrjP2j/mb5iI/UASFSPZiQ/IyxDr0AQaQIDAQAB\nAoGAEvBFzBNa+7J4PXnRQlYEK/tvsd0bBZX33ceacMubHl6WVZbphltLq+fMTBPP\nLjXmtpC+aJ7Lvmyl+wTi/TsxE9vxW5JnbuRT48rnZ/Xwq0eozDeEeIBRrpsr7Rvr\n7ctrgzr4m4yMHq9aDgpxj8IR7oHkfwnmWr0wM3FuiVlj650CQQDineeNZ1hUTkj4\nD3O+iCi3mxEVEeJrpqrmSFolRMb+iozrIRKuJlgcOs+Gqi2fHfOTTL7LkpYe8SVg\ne3JxUdVLAkEAxvcZXk+byMFoetrnlcMR13VHUpoVeoV9qkv6CAWLlbMdgf7uKmgp\na1Yp3QPDNQQqkPvrqtfR19JWZ4uy1qREmwJALTU3BjyBoH/liqb6fh4HkWk75Som\nMzeSjFIOubSYxhq5tgZpBZjcpvUMhV7Zrw54kwASZ+YcUJvmyvKViAm9NQJBAKF7\nDyXSKrem8Ws0m1ybM7HQx5As6l3EVhePDmDQT1eyRbKp+xaD74nkJpnwYdB3jyyY\nqc7A1tj5J5NmeEFolR0CQQCn76Xp8HCjGgLHw9vg7YyIL28y/XyfFyaZAzzK+Yia\nakNwQ6NeGtXSsuGCcyyfpacHp9xy8qXQNKSkw03/5vDO\n-----END RSA PRIVATE KEY-----\n"; let publicPkcs1Str1024: string = "-----BEGIN RSA PUBLIC KEY-----\nMIGJAoGBALAg3eavbX433pOjGdWdpL7HIr1w1EAeIcaCtuMfDpECPdX6X5ZjrwiE\nh7cO51WXMT2gyN45DCQySr/8cLE2UiUVHo7qlrSatdLA9ETtgob3sJ4qTaBg5Lxg\nSHy2gC+bvEpuIuRe64yXGuM/aP+ZvmIj9QBIVI9mJD8jLEOvQBBpAgMBAAE=\n-----END RSA PUBLIC KEY-----\n";
然后,创建非对称密钥生成器并进行转换:
import { cryptoFramework } from '@kit.CryptoArchitectureKit'; async function TestPkcs1ToPkcs8ByPromise() { let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024'); let keyPair = await asyKeyGenerator.convertPemKey(publicPkcs1Str1024, priKeyPkcs1Str1024); let priPemKey = keyPair.priKey; let pubPemKey = keyPair.pubKey; let priString = priPemKey.getEncodedPem('PKCS8'); let pubString = pubPemKey.getEncodedPem('X509'); console.info("[promise]TestPkcs1ToPkcs8ByPromise priString output is " + priString); console.info("[promise]TestPkcs1ToPkcs8ByPromise pubString output is " + pubString); }
- 这里首先创建了一个 RSA 密钥生成器,指定密钥类型为“RSA1024”。然后使用
convertPemKey
方法,传入公钥和私钥字符串数据,将其转换为非对称密钥对。转换成功后,可以获取转换后的密钥对中的公钥和私钥,并使用getEncodedPem
方法将其转换为指定格式(如 PKCS8 格式的私钥和 X509 格式的公钥)的字符串,以便进行后续的操作或存储。四、总结
在 HarmonyOS Next 中,非对称密钥生成涉及多种算法和生成方式。不同算法如 RSA、ECC、DSA、SM2、Ed25519、X25519 和 DH 各具特点,适用于不同场景。指定规格方式有字符串参数和密钥参数两种,我们开发者需根据实际需求选择。在转换非对称密钥对时,要遵循相应的转换要求和流程,如 PEM 格式字符串数据转换时需确保公钥和私钥满足特定规范。要点包括了解各种算法的特性、掌握不同指定规格方式的适用场景等。注意事项有注意算法的安全性和性能,如某些算法在特定场景下可能存在安全风险或性能瓶颈;同时,要确保密钥的妥善管理,防止密钥泄露导致安全问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。