【鸿蒙实战开发】基于@ohos/crypto-js实现加解密工具箱

100 篇文章 1 订阅
100 篇文章 2 订阅

@ohos/crypto-js简介

@ohos/crypto-js是一个根据crypto-js库移植的鸿蒙三方库,适配源库4.2.0版本,提供了一系列加密算法和安全工具,主要用于执行各种消息摘要计算和对称加解密操作。

@ohos/crypto-js与cryptoFramework规格对比

@ohos/crypto-js不支持国密算法和非对称加解密算法,国密算法可以使用三方库 @yyz116/sm-crypto

消息摘要算法

MD5算法

MD5(Message-Digest Algorithm 5)是一种广泛使用的散列函数,用于生成128位(32个十六进制数字)的消息摘要。

demo展示

代码实现

根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

  • 一次性加密

调用CryptoJS.MD5接口,传入明文,生成密文。

// MD5加密

let mdOutput = CryptoJS.MD5('Message').toString()
  • 分段加密

根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

调用CryptoJS.algo.MD5.create接口创建Hasher对象,通过update方法传入多段明文,通过finalize方法生成密文。

// 创建MD5Hasher实例

let md = CryptoJS.algo.MD5.create()

// 分段传入明文

md.update("Message Part 1")

md.update("Message Part 2")

md.update("Message Part 3")

// 完成加密,输出密文

let mdOutput = md.finalize().toString()

SHA算法

demo展示

SHA-1

SHA-1是基于MD4散列算法设计的,SHA-1接受最大长度为2^64位的消息,并生成一个160位的散列值。

代码实现

根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

  • 一次性加密

    调用CryptoJS.SHA1接口,传入明文,生成密文。

// SHA1加密

let sha1Output = CryptoJS.SHA1('Message').toString()
  • 分段加密

    根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

    建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

    调用CryptoJS.algo.SHA1.create接口创建Hasher对象,通过update方法传入多段明文,通过finalize方法生成密文。

// 创建SHA1Hasher实例

let sha1 = CryptoJS.algo.SHA1.create()

// 分段传入明文

sha1.update("Message Part 1")

sha1.update("Message Part 2")

sha1.update("Message Part 3")

// 完成加密,输出密文

let sha1Output = sha1.finalize().toString()

SHA-2

SHA-2是一系列散列函数的统称,包括SHA-224、SHA-256、SHA-384和SHA-512等。

代码实现

  • 一次性加密(以SHA-256为例)

    调用CryptoJS.SHA256接口,传入明文,生成密文。

// SHA2加密

let sha256Output = CryptoJS.SHA256('Message').toString()
  • 分段加密(以SHA-256为例)

    根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

    建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

    调用CryptoJS.algo.SHA256.create接口创建Hasher对象,通过update方法传入多段明文,通过finalize方法生成密文。

// 创建SHA2Hasher实例

let sha256 = CryptoJS.algo.SHA256.create()

// 分段传入明文

sha256.update("Message Part 1")

sha256.update("Message Part 2")

sha256.update("Message Part 3")

// 完成加密,输出密文

let sha256Output = sha256.finalize().toString()

SHA-3

SHA-3是NIST在2015年正式发布的散列函数标准,采用了全新的结构。

代码实现

  • 一次性加密

    调用CryptoJS.SHA3接口,传入明文与输出长度,生成密文。输出长度可以为224、256、384、512,默认为512。

    // SHA3加密,可以配置输出长度

    let sha3Output = CryptoJS.SHA3(‘Message’, { outputLength: 256 }).toString()

  • 分段加密

    根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

    建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

    调用CryptoJS.algo.SHA3.create接口并配置输出长度创建Hasher对象,通过update方法传入多段明文,通过finalize方法生成密文。

// 创建SHA3Hasher实例

let sha3Output = CryptoJS.algo.SHA3.create({ outputLength: 256 })

// 分段传入明文

sha3Output.update("Message Part 1")

sha3Output.update("Message Part 2")

sha3Output.update("Message Part 3")

// 完成加密,输出密文

let sha3OutputOutput = sha3Output.finalize().toString()

消息认证码算法

HMAC算法

HMAC(Hash-based Message Authentication Code)是一种基于哈希函数和密钥的消息认证码算法。

demo展示

代码实现

根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

  • 一次性加密(以SHA-256为例)

    调用CryptoJS.HmacSHA256接口,传入明文与密钥,生成密文。

    // HMAC加密,使用SHA256算法

    let hmacSHA256Output = CryptoJS.HmacSHA256("Message", "Secret Passphrase").toString()
  • 分段加密(以SHA-256为例)

调用 CryptoJS.algo.HMAC.create接口,配置HasherStatic对象和密钥创建HMAC对象,HasherStatic可以使用crypto-js支持的任意摘要算法,如CryptoJS.algo.SHA256。通过update方法传入多段明文,通过finalize方法生成密文。

// 创建HMAC算法实例,配置SHA256 HasherStatic对象和密钥

let hmacSHA256 = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, "Secret Passphrase")

// 分段传入明文

hmacSHA256.update("Message Part 1")

hmacSHA256.update("Message Part 2")

hmacSHA256.update("Message Part 3")

// 完成加密,输出密文

let hmacSHA256Output = hmacSHA256.finalize().toString()

密钥派生算法

PBKDF2算法

PBKDF2(Password-Based Key Derivation Function 2)是一种基于密码的密钥生成算法。

demo展示

代码实现

根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

  • 一次性加密(以SHA256为例)

    调用CryptoJS.PBKDF2接口,参数为密码、盐值、密钥长度、消息摘要算法、迭代次数,生成新密码。

// PBKDF2加密,可以自定义密钥长度、哈希算法和迭代次数

let pbkdf2SHA256Output = CryptoJS.PBKDF2("Message", "salt", {

keySize: 10, // 密钥长度、

hasher: CryptoJS.algo.SHA256, // 哈希算法

iterations: 100 // 迭代次数

}).toString()
  • 分段加密(以SHA256为例)

    调用CryptoJS.algo.PBKDF2.create接口,配置密钥长度、消息摘要算法、迭代次数创建PBKDF2对象。

通过compute方法传入分段密码和盐值生成密码WordArray对象,通过数组克隆与拼接操作生成完整新密码。

// 创建PBKDF2算法实例,配置密钥长度、哈希算法和迭代次数

let pbkdf2SHA256 = CryptoJS.algo.PBKDF2.create({

keySize: 10,

hasher: CryptoJS.algo.SHA256,

iterations: 100

})

// 分段传入密码和盐值,分段生成新密码

let pbkdf2SHA256Output1 = pbkdf2SHA256.compute("Message Part 1", "salt")

let pbkdf2SHA256Output2 = pbkdf2SHA256.compute("Message Part 2", "salt")

let pbkdf2SHA256Output3 = pbkdf2SHA256.compute("Message Part 3", "salt")

// 拼接成完整新密码

let pbkdf2SHA256Output = pbkdf2SHA256Output1.clone()

.concat(pbkdf2SHA256Output2)

.concat(pbkdf2SHA256Output3)

.toString()

对称加解密算法

DES算法

DES(Data Encryption Standard)加密是一种对称加密算法。

demo展示

代码实现

根据数据量,可以分段也可以不分段,该算法库目前没有对单次加密的数据量设置大小限制。

建议对于大数据量的对称加解密,采用多次分段的方式传入数据。

  • 一次性加密

    DES加密可以配置的加密参数为明文、密钥、模式、填充、偏移量。

    明文、密钥、偏移量通常会在加解密前解析成对应编码的WordArray对象。

    crypto-js支持的加密模式:CBC、ECB、CFB、CTR、OFB。

    crypto-js支持的填充方式:Pkcs7、Iso97971、AnsiX923、Iso10126、ZeroPadding、NoPadding。

    当不传入模式、填充、偏移量时,会默认使用CBC加密模式、Pkcs7填充方式和一个随机生成的偏移量。

    ECB模式不需要偏移量。

    const word: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("Message") // 使用Utf8格式解析明文

    const key: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("key") // 使用Utf8格式解析密钥

    const iv: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse('iv') // 使用Utf8格式解析偏移量

    // DES加密,可以配置加密模式、填充方式和偏移量

    let desOutput CryptoJS.DES.encrypt(word, key, {

    mode: CryptoJS.mode.CBC,

    padding: CryptoJS.pad.Pkcs7,

    iv: iv

    }).ciphertext.toString()
  • 一次性解密

@ohos/crypto-js只能解密格式为Base64的密文,如果密文是其他格式,需要先转换成Base64。

解密返回的结果必须用Utf8格式转为明文。

// 使用hex格式解析密文,并转为Base64格式,如果密文已经是Base64格式则不需要转换

let word: CryptoJS.lib.WordArray | string = CryptoJS.enc.Hex.parse("ciphertext")

word = CryptoJS.enc.Base64.stringify(word)

const key: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("key") // 使用Utf8格式解析密钥

const iv: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse('iv') // 使用Utf8格式解析偏移量

// DES解密,需要配置与加密一致的加密模式、填充方式和偏移量

let desDecryptOutput = CryptoJS.DES.decrypt(word, key, {

mode: CryptoJS.mode.CBC,

padding: CryptoJS.pad.Pkcs7,

iv: iv

}).toString(CryptoJS.enc.Utf8) // 将解密结果转为utf8格式才能正确显示
  • 分段加密

调用CryptoJS.algo.DES.createEncryptor接口,配置密钥、模式、填充、偏移量创建DES加密算法对象,调用process方法传入分段明文WordArray对象生成分段密文WordArray对象,通过数组克隆与拼接操作生成完整密文。

let word1: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("plaintext1")

let word2: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("plaintext2")

let word3: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("plaintext3")

const key: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse("key")

const iv: CryptoJS.lib.WordArray = CryptoJS.enc.Utf8.parse('iv')

// 创建DES加密实例,配置加密模式、填充方式和偏移量

let desEncrypt = CryptoJS.algo.DES.createEncryptor(key, {

mode: CryptoJS.mode.CBC,

padding: CryptoJS.pad.Pkcs7,

iv: iv

})

// 分段传入明文

const desEncryptOutput1 = desEncrypt.process(word1)

const desEncryptOutput2 = desEncrypt.process(word2)

const desEncryptOutput3 = desEncrypt.process(word3)

const desEncryptOutput4 = desEncrypt.finalize()

// 拼接加密结果 默认为Hex格式

let desEncryptOutput = desEncryptOutput1.clone()

.concat(desEncryptOutput2)

.concat(desEncryptOutput3)

.concat(desEncryptOutput4)

.toString()
  • 分段解密

调用CryptoJS.algo.DES.createDecryptor接口,配置密钥、模式、填充、偏移量创建DES解密算法对象,调用process方法传入分段密文WordArray对象生成分段明文WordArray对象,通过数组克隆与拼接操作生成完整明文,并转为utf8格式显示。

// 使用对应格式解析密文

const plaintextWordArray: CryptoJS.lib.WordArray = CryptoJS.enc.Hex.parse(desEncryptOutput)

let segments: CryptoJS.lib.WordArray[] = []

let offset = 0

let length = plaintextWordArray.sigBytes

let segmentSize = 8

// 对密文分段

while (offset < length) {

let clone = plaintextWordArray.clone()

clone.clamp() // 清除多余的字节

// 确保分段不会超出消息的末尾

let size = Math.min(segmentSize, length - offset)

clone.sigBytes = size

// 截取分段

segments.push(clone)

// 移动到下一个分段

offset += segmentSize

plaintextWordArray.words.splice(0, size / 4) // 每个字的大小是4字节

plaintextWordArray.sigBytes -= size

}

// 创建DES解密实例,配置加密模式、填充方式和偏移量

let desDecrypt = CryptoJS.algo.DES.createDecryptor(key, {

mode: CryptoJS.mode.CBC,

padding: CryptoJS.pad.Pkcs7,

iv: iv

})

// 创建一个空WordArray

let ciphertextWordArray: CryptoJS.lib.WordArray = CryptoJS.lib.WordArray.create()

// 分段解密,同时拼接结果

for (let word of segments) {

let segmentOutput = desDecrypt.process(word)

ciphertextWordArray.concat(segmentOutput)

}

let finalizeOutput = desDecrypt.finalize()

ciphertextWordArray.concat(finalizeOutput)

// 将明文转回Utf8格式

let desDecryptOutput = ciphertextWordArray.toString(CryptoJS.enc.Utf8)

鸿蒙全栈开发全新学习指南

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以要有一份实用的鸿蒙(HarmonyOS NEXT)学习路线与学习文档用来跟着学习是非常有必要的。

针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

本路线共分为四个阶段

第一阶段:鸿蒙初中级开发必备技能

在这里插入图片描述

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

在这里插入图片描述

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:gitee.com/MNxiaona/733GH

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

在这里插入图片描述

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值