1# 消息摘要计算SHA256(ArkTS) 2 3<!--Kit: Crypto Architecture Kit--> 4<!--Subsystem: Security--> 5<!--Owner: @zxz--3--> 6<!--Designer: @lanming--> 7<!--Tester: @PAFT--> 8<!--Adviser: @zengyawen--> 9 10对应的算法规格请查看[消息摘要计算算法规格](crypto-generate-message-digest-overview.md#支持的算法与规格)。 11 12> **说明:** 13> 14> 从API version 12开始,轻量级智能穿戴设备支持消息摘要的计算与操作。 15 16## 开发步骤 17 18在调用update接口传入数据时,可以[一次性传入所有数据](#摘要算法一次性传入),也可以把数据人工分段,然后[分段update](#分段摘要算法)。对于同一段数据而言,计算结果没有差异。对于数据量较大的数据,开发者可以根据实际需求选择是否分段传入。 19 20下面分别提供两种方式的示例代码。 21 22### 摘要算法(一次性传入) 23 241. 调用[cryptoFramework.createMd](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatemd),指定摘要算法SHA256,生成摘要实例(Md)。 25 262. 调用[Md.update](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#update-6),传入自定义消息,进行摘要更新计算。单次update长度没有限制。 27 283. 调用[Md.digest](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#digest),获取摘要计算结果。 29 304. 调用[Md.getMdLength](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getmdlength),获取摘要计算长度,单位为字节。 31 32- 以使用await方式单次传入数据,获取摘要计算结果为例: 33 34 ```ts 35 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 36 import { buffer } from '@kit.ArkTS'; 37 38 async function doSha256() { 39 let mdAlgName = 'SHA256'; // 摘要算法名。 40 let message = 'mdTestMessage'; // 待摘要的数据。 41 let md = cryptoFramework.createMd(mdAlgName); 42 // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制。 43 await md.update({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }); 44 let mdResult = await md.digest(); 45 console.info('Md result:' + mdResult.data); 46 let mdLen = md.getMdLength(); 47 console.info("md len: " + mdLen); 48 } 49 ``` 50 51- 以使用同步方式单次传入数据,获取摘要计算结果为例: 52 53 ```ts 54 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 55 import { buffer } from '@kit.ArkTS'; 56 57 function doSha256BySync() { 58 let mdAlgName = 'SHA256'; // 摘要算法名。 59 let message = 'mdTestMessage'; // 待摘要的数据。 60 let md = cryptoFramework.createMd(mdAlgName); 61 // 数据量较少时,可以只做一次update,将数据全部传入,接口未对入参长度做限制。 62 md.updateSync({ data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }); 63 let mdResult = md.digestSync(); 64 console.info('[Sync]:Md result:' + mdResult.data); 65 let mdLen = md.getMdLength(); 66 console.info("md len: " + mdLen); 67 } 68 ``` 69 70### 分段摘要算法 71 721. 调用[cryptoFramework.createMd](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#cryptoframeworkcreatemd),指定摘要算法SHA256,生成摘要实例(Md)。 73 742. 传入自定义消息,将一次传入数据量设置为20字节,多次调用[Md.update](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#update-7),进行摘要更新计算。 75 763. 调用[Md.digest](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#digest-1),获取摘要计算结果。 77 784. 调用[Md.getMdLength](../../reference/apis-crypto-architecture-kit/js-apis-cryptoFramework.md#getmdlength),获取摘要计算长度,单位为字节。 79 80- 以使用await方式分段传入数据,获取摘要计算结果为例: 81 82 ```ts 83 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 84 import { buffer } from '@kit.ArkTS'; 85 86 async function doLoopSha256() { 87 let mdAlgName = "SHA256"; // 摘要算法名。 88 let md = cryptoFramework.createMd(mdAlgName); 89 // 假设信息总共43字节,根据utf-8解码后,也是43字节。 90 let messageText = "aaaaa.....bbbbb.....ccccc.....ddddd.....eee"; 91 let messageData = new Uint8Array(buffer.from(messageText, 'utf-8').buffer); 92 let updateLength = 20; // 假设以20字节为单位进行分段update,实际并无要求。 93 for (let i = 0; i < messageData.length; i += updateLength) { 94 let updateMessage = messageData.subarray(i, i + updateLength); 95 let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage }; 96 await md.update(updateMessageBlob); 97 } 98 let mdOutput = await md.digest(); 99 console.info("md result: " + mdOutput.data); 100 let mdLen = md.getMdLength(); 101 console.info("md len: " + mdLen); 102 } 103 ``` 104 105- 以使用同步方式分段传入数据,获取摘要计算结果为例: 106 107 ```ts 108 import { cryptoFramework } from '@kit.CryptoArchitectureKit'; 109 import { buffer } from '@kit.ArkTS'; 110 111 function doLoopSha256BySync() { 112 let mdAlgName = "SHA256"; // 摘要算法名。 113 let md = cryptoFramework.createMd(mdAlgName); 114 // 假设信息总共43字节,根据utf-8解码后,也是43字节。 115 let messageText = "aaaaa.....bbbbb.....ccccc.....ddddd.....eee"; 116 let messageData = new Uint8Array(buffer.from(messageText, 'utf-8').buffer); 117 let updateLength = 20; // 假设以20字节为单位进行分段update,实际并无要求。 118 for (let i = 0; i < messageData.length; i += updateLength) { 119 let updateMessage = messageData.subarray(i, i + updateLength); 120 let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage }; 121 md.updateSync(updateMessageBlob); 122 } 123 let mdOutput = md.digestSync(); 124 console.info("[Sync]:md result: " + mdOutput.data); 125 let mdLen = md.getMdLength(); 126 console.info("md len: " + mdLen); 127 } 128 ```