加解密算法庫框架

2024-01-23 15:57 更新

為屏蔽底層硬件和算法庫,向上提供統(tǒng)一的密碼算法庫加解密相關(guān)接口。

說明

本模塊首批接口從API version 9開始支持。

導(dǎo)入模塊

  1. import cryptoFramework from "@ohos.security.cryptoFramework"

Result

表示執(zhí)行結(jié)果的枚舉。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

說明

INVALID_PARAMS

401

非法入?yún)ⅰ?/p>

NOT_SUPPORT

801

操作不支持。

ERR_OUT_OF_MEMORY

17620001

內(nèi)存錯(cuò)誤。

ERR_RUNTIME_ERROR

17620002

運(yùn)行時(shí)外部錯(cuò)誤。

ERR_CRYPTO_OPERATION

17630001

調(diào)用三方算法庫API出錯(cuò)。

DataBlob

buffer數(shù)組。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

data

Uint8Array

數(shù)據(jù)。

cryptoFramework.createMac

createMac(algName : string) : Mac

生成Mac實(shí)例,用于進(jìn)行消息認(rèn)證碼的計(jì)算與操作。

支持的規(guī)格詳見框架概述“HMAC消息認(rèn)證碼算法規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

指定摘要算法,支持算法請參考“HMAC算法支持范圍”一節(jié)

返回值

類型

說明

Mac

返回由輸入算法指定生成的Mac對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var mac;
  3. try {
  4. // 參數(shù)選擇請參考上述算法支持范圍
  5. mac = cryptoFramework.createMac("SHA256");
  6. } catch (error) {
  7. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  8. }

Mac

Mac類,調(diào)用Mac方法可以進(jìn)行MAC(Message Authentication Code)加密計(jì)算。調(diào)用前,需要通過createMac構(gòu)造Mac實(shí)例。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

代表指定的摘要算法名

init

init(key : SymKey, callback : AsyncCallback<void>) : void;

使用對稱密鑰初始化Mac計(jì)算

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

key

SymKey

共享對稱密鑰

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var mac;
  3. try {
  4. mac = cryptoFramework.createMac("SHA256");
  5. } catch (error) {
  6. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. var KeyBlob;
  9. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  10. symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
  11. if (err) {
  12. console.error("[Callback] err: " + err.code);
  13. }
  14. mac.init(symKey, (err1, ) => {
  15. if (err1) {
  16. console.error("[Callback] err: " + err1.code);
  17. }
  18. });
  19. });

init

init(key : SymKey) : Promise<void>;

使用對稱密鑰初始化Mac計(jì)算

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

key

SymKey

共享對稱密鑰

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var mac;
  3. try {
  4. mac = cryptoFramework.createMac("SHA256");
  5. } catch (error) {
  6. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Mac algName is: " + mac.algName);
  9. var KeyBlob;
  10. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  11. var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
  12. promiseConvertKey.then(symKey => {
  13. var promiseMacInit = mac.init(symKey);
  14. return promiseMacInit;
  15. }).catch(error => {
  16. console.error("[Promise]: error: " + error.message);
  17. });

update

update(input : DataBlob, callback : AsyncCallback<void>) : void;

傳入消息進(jìn)行Mac更新計(jì)算

說明

Hmac算法多次調(diào)用update更新的代碼示例詳見開發(fā)指導(dǎo)“使用消息認(rèn)證碼操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

input

DataBlob

傳入的消息

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var KeyBlob;
  3. var mac;
  4. try {
  5. mac = cryptoFramework.createMac("SHA256");
  6. } catch (error) {
  7. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  8. }
  9. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  10. symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
  11. if (err) {
  12. console.error("[Callback] err: " + err.code);
  13. }
  14. mac.init(symKey, (err1, ) => {
  15. if (err1) {
  16. console.error("[Callback] err: " + err1.code);
  17. }
  18. let blob;
  19. mac.update(blob, (err2, data) => {
  20. if (err2) {
  21. console.error("[Callback] err: " + err2.code);
  22. }
  23. });
  24. });
  25. });

update

update(input : DataBlob) : Promise<void>;

傳入消息進(jìn)行Mac更新計(jì)算

說明

Hmac算法多次調(diào)用update更新的代碼示例詳見開發(fā)指導(dǎo)“使用消息認(rèn)證碼操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

input

DataBlob

傳入的消息

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var mac;
  3. try {
  4. mac = cryptoFramework.createMac("SHA256");
  5. } catch (error) {
  6. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Mac algName is: " + mac.algName);
  9. var KeyBlob;
  10. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  11. var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
  12. promiseConvertKey.then(symKey => {
  13. var promiseMacInit = mac.init(symKey);
  14. return promiseMacInit;
  15. }).then(() => {
  16. let blob;
  17. var promiseMacUpdate = mac.update(blob);
  18. return promiseMacUpdate;
  19. }).catch(error => {
  20. console.error("[Promise]: error: " + error.message);
  21. });

doFinal

doFinal(callback : AsyncCallback<DataBlob>) : void;

返回Mac的計(jì)算結(jié)果

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

callback

AsyncCallback<DataBlob>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var KeyBlob;
  3. var mac;
  4. try {
  5. mac = cryptoFramework.createMac("SHA256");
  6. } catch (error) {
  7. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  8. }
  9. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  10. symKeyGenerator.convertKey(KeyBlob, (err, symKey) => {
  11. if (err) {
  12. console.error("[Callback] err: " + err.code);
  13. }
  14. mac.init(symKey, (err1, ) => {
  15. if (err1) {
  16. console.error("[Callback] err: " + err1.code);
  17. }
  18. let blob;
  19. mac.update(blob, (err2, ) => {
  20. if (err2) {
  21. console.error("[Callback] err: " + err2.code);
  22. }
  23. mac.doFinal((err3, macOutput) => {
  24. if (err3) {
  25. console.error("[Callback] err: " + err3.code);
  26. } else {
  27. console.error("[Promise]: HMAC result: " + macOutput);
  28. }
  29. });
  30. });
  31. });
  32. });

doFinal

doFinal() : Promise<DataBlob>

返回Mac的計(jì)算結(jié)果

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

Promise<DataBlob>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var mac;
  3. try {
  4. mac = cryptoFramework.createMac("SHA256");
  5. } catch (error) {
  6. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Mac algName is: " + mac.algName);
  9. var KeyBlob;
  10. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  11. var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
  12. promiseConvertKey.then(symKey => {
  13. var promiseMacInit = mac.init(symKey);
  14. return promiseMacInit;
  15. }).then(() => {
  16. let blob;
  17. var promiseMacUpdate = mac.update(blob);
  18. return promiseMacUpdate;
  19. }).then(() => {
  20. var PromiseMacDoFinal = mac.doFinal();
  21. return PromiseMacDoFinal;
  22. }).then(macOutput => {
  23. console.error("[Promise]: HMAC result: " + macOutput.data);
  24. }).catch(error => {
  25. console.error("[Promise]: error: " + error.message);
  26. });

getMacLength

getMacLength() : number

獲取Mac消息認(rèn)證碼的長度(字節(jié)數(shù))

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

number

返回mac計(jì)算結(jié)果的字節(jié)長度

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var mac;
  3. try {
  4. mac = cryptoFramework.createMac("SHA256");
  5. } catch (error) {
  6. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Mac algName is: " + mac.algName);
  9. var KeyBlob;
  10. var symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");
  11. var promiseConvertKey = symKeyGenerator.convertKey(KeyBlob);
  12. promiseConvertKey.then(symKey => {
  13. var promiseMacInit = mac.init(symKey);
  14. return promiseMacInit;
  15. }).then(() => {
  16. let blob;
  17. var promiseMacUpdate = mac.update(blob);
  18. return promiseMacUpdate;
  19. }).then(() => {
  20. var PromiseMacDoFinal = mac.doFinal();
  21. return PromiseMacDoFinal;
  22. }).then(macOutput => {
  23. console.error("[Promise]: HMAC result: " + macOutput.data);
  24. let macLen = mac.getMacLength();
  25. console.error("MAC len: " + macLen);
  26. }).catch(error => {
  27. console.error("[Promise]: error: " + error.message);
  28. });

cryptoFramework.createMd

createMd(algName : string) : Md

生成Md實(shí)例,用于進(jìn)行消息摘要的計(jì)算與操作。

支持的規(guī)格詳見框架概述“MD消息摘要算法規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

指定摘要算法,支持算法請參考“MD算法支持范圍”一節(jié)

返回值

類型

說明

Md

返回由輸入算法指定生成的Md對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var md;
  3. try {
  4. // 參數(shù)選擇請參考上述算法支持范圍
  5. md = cryptoFramework.createMd("SHA256");
  6. } catch (error) {
  7. console.error("[Promise]: error code: " + error.code + ", message is: " + error.message);
  8. }

Md

Md類,調(diào)用Md方法可以進(jìn)行MD(Message Digest)摘要計(jì)算。調(diào)用前,需要通過createMd構(gòu)造Md實(shí)例。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

代表指定的摘要算法名

update

update(input : DataBlob, callback : AsyncCallback<void>) : void;

傳入消息進(jìn)行Md更新計(jì)算

說明

Md算法多次調(diào)用update更新的代碼示例詳見開發(fā)指導(dǎo)“使用摘要操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

input

DataBlob

傳入的消息

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var md;
  3. try {
  4. md = cryptoFramework.createMd("SHA256");
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Md algName is: " + md.algName);
  9. let blob;
  10. md.update(blob, (err,) => {
  11. if (err) {
  12. console.error("[Callback] err: " + err.code);
  13. }
  14. });

update

update(input : DataBlob) : Promise<void>;

傳入消息進(jìn)行Md更新計(jì)算

說明

Md算法多次調(diào)用update更新的代碼示例詳見開發(fā)指導(dǎo)“使用摘要操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù)名

類型

必填

說明

input

DataBlob

傳入的消息

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var md;
  3. try {
  4. md = cryptoFramework.createMd("SHA256");
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Md algName is: " + md.algName);
  9. let blob;
  10. var promiseMdUpdate = md.update(blob);
  11. promiseMdUpdate.then(() => {
  12. // do something
  13. }).catch(error => {
  14. console.error("[Promise]: error: " + error.message);
  15. });

digest

digest(callback : AsyncCallback<DataBlob>) : void

返回Md的計(jì)算結(jié)果

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù)名

類型

必填

說明

callback

AsyncCallback<DataBlob>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var md;
  3. try {
  4. md = cryptoFramework.createMd("SHA256");
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Md algName is: " + md.algName);
  9. let blob;
  10. md.update(blob, (err,) => {
  11. if (err) {
  12. console.error("[Callback] err: " + err.code);
  13. }
  14. md.digest((err1, mdOutput) => {
  15. if (err1) {
  16. console.error("[Callback] err: " + err1.code);
  17. } else {
  18. console.error("[Callback]: MD result: " + mdOutput);
  19. }
  20. });
  21. });

digest

digest() : Promise<DataBlob>

返回Md的計(jì)算結(jié)果

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

Promise<DataBlob>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var md;
  3. try {
  4. md = cryptoFramework.createMd("SHA256");
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Md algName is: " + md.algName);
  9. let blob;
  10. var promiseMdUpdate = md.update(blob);
  11. promiseMdUpdate.then(() => {
  12. var PromiseMdDigest = md.digest();
  13. return PromiseMdDigest;
  14. }).then(mdOutput => {
  15. console.error("[Promise]: MD result: " + mdOutput.data);
  16. }).catch(error => {
  17. console.error("[Promise]: error: " + error.message);
  18. });

getMdLength

getMdLength() : number

獲取Md消息摘要長度(字節(jié)數(shù))

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

number

返回md計(jì)算結(jié)果的字節(jié)長度

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var md;
  3. try {
  4. md = cryptoFramework.createMd("SHA256");
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. console.error("Md algName is: " + md.algName);
  9. let blob;
  10. var promiseMdUpdate = md.update(blob);
  11. promiseMdUpdate.then(() => {
  12. var PromiseMdDigest = md.digest();
  13. return PromiseMdDigest;
  14. }).then(mdOutput => {
  15. console.error("[Promise]: MD result: " + mdOutput.data);
  16. let mdLen = md.getMdLength();
  17. console.error("MD len: " + mdLen);
  18. }).catch(error => {
  19. console.error("[Promise]: error: " + error.message);
  20. });

cryptoFramework.createRandom

createRandom() : Random

生成Random實(shí)例,用于進(jìn)行隨機(jī)數(shù)的計(jì)算與設(shè)置種子。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值

類型

說明

Random

返回由輸入算法指定生成的Random對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. try {
  3. var rand = cryptoFramework.createRandom();
  4. } catch (error) {
  5. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  6. }

Random

Random類,調(diào)用Random方法可以進(jìn)行隨機(jī)數(shù)計(jì)算。調(diào)用前,需要通過createRandom構(gòu)造Random實(shí)例。

generateRandom

generateRandom(len : number, callback: AsyncCallback<DataBlob>) : void;

生成指定長度的隨機(jī)數(shù)

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

len

number

表示生成隨機(jī)數(shù)的長度

callback

AsyncCallback<DataBlob>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var rand;
  3. try {
  4. rand = cryptoFramework.createRandom();
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. rand.generateRandom(12, (err, randData) => {
  9. if (err) {
  10. console.error("[Callback] err: " + err.code);
  11. } else {
  12. console.error("[Callback]: generate random result: " + randData.data);
  13. }
  14. });

generateRandom

generateRandom(len : number) : Promise<DataBlob>;

生成指定長度的隨機(jī)數(shù)

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

len

number

表示生成隨機(jī)數(shù)的長度

返回值:

類型

說明

Promise<DataBlob>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var rand;
  3. try {
  4. rand = cryptoFramework.createRandom();
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. var promiseGenerateRand = rand.generateRandom(12);
  9. promiseGenerateRand.then(randData => {
  10. console.error("[Promise]: rand result: " + randData.data);
  11. }).catch(error => {
  12. console.error("[Promise]: error: " + error.message);
  13. });

setSeed

setSeed(seed : DataBlob) : void;

設(shè)置指定的種子

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù)名

類型

必填

說明

seed

DataBlob

設(shè)置的種子

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. var rand;
  3. try {
  4. rand = cryptoFramework.createRandom();
  5. } catch (error) {
  6. console.error("[Callback]: error code: " + error.code + ", message is: " + error.message);
  7. }
  8. rand.generateRandom(12, (err, randData) => {
  9. if (err) {
  10. console.error("[Callback] err: " + err.code);
  11. } else {
  12. console.error("[Callback]: generate random result: " + randData.data);
  13. try {
  14. rand.setSeed(randData);
  15. } catch (error) {
  16. console.log("setSeed failed, errCode: " + error.code + ", errMsg: " + error.message);
  17. }
  18. }
  19. });

ParamsSpec

加解密參數(shù),在進(jìn)行對稱加解密時(shí)需要構(gòu)造其子類對象,并將子類對象傳入init()方法。

適用于需要iv等參數(shù)的對稱加解密模式(對于無iv等參數(shù)的模式如ECB模式,無需構(gòu)造,在init()中傳入null即可)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

指明對稱加解密參數(shù)的算法模式??蛇x值如下:

- "IvParamsSpec": 適用于CBC|CTR|OFB|CFB模式

- "GcmParamsSpec": 適用于GCM模式

- "CcmParamsSpec": 適用于CCM模式

說明

由于init()的params參數(shù)是ParamsSpec類型(父類),而實(shí)際需要傳入具體的子類對象(如IvParamsSpec),因此在構(gòu)造子類對象時(shí)應(yīng)設(shè)置其父類ParamsSpec的algName參數(shù),使算法庫在init()時(shí)知道傳入的是哪種子類對象。

IvParamsSpec

加解密參數(shù)ParamsSpec的子類,用于在對稱加解密時(shí)作為init()方法的參數(shù)。

適用于CBC、CTR、OFB、CFB這些僅使用iv作為參數(shù)的加解密模式。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

iv

DataBlob

指明加解密參數(shù)iv。常見取值如下:

- AES的CBC|CTR|OFB|CFB模式:iv長度為16字節(jié)

- 3DES的CBC|OFB|CFB模式:iv長度為8字節(jié)

說明

傳入init()方法前需要指定其algName屬性(來源于父類ParamsSpec)。

GcmParamsSpec

加解密參數(shù)ParamsSpec的子類,用于在對稱加解密時(shí)作為init()方法的參數(shù)。

適用于GCM模式。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

iv

DataBlob

指明加解密參數(shù)iv,長度為12字節(jié)

aad

DataBlob

指明加解密參數(shù)aad,長度為8字節(jié)

authTag

DataBlob

指明加解密參數(shù)authTag,長度為16字節(jié)。

采用GCM模式加密時(shí),需要獲取doFinal()輸出的DataBlob,取出其末尾16字節(jié)作為解密時(shí)init()方法的入?yún)?a rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" >GcmParamsSpec中的的authTag

說明

傳入init()方法前需要指定其algName屬性(來源于父類ParamsSpec)。

CcmParamsSpec

加解密參數(shù)ParamsSpec的子類,用于在對稱加解密時(shí)作為init()方法的參數(shù)。

適用于CCM模式。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

iv

DataBlob

指明加解密參數(shù)iv,長度為7字節(jié)

aad

DataBlob

指明加解密參數(shù)aad,長度為8字節(jié)

authTag

DataBlob

指明加解密參數(shù)authTag,長度為12字節(jié)。

采用CCM模式加密時(shí),需要獲取doFinal()輸出的DataBlob,取出其末尾12字節(jié)作為解密時(shí)init()方法的入?yún)?a rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" >CcmParamsSpec中的authTag

說明

傳入init()方法前需要指定其algName屬性(來源于父類ParamsSpec)。

CryptoMode

表示加解密操作的枚舉。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

說明

ENCRYPT_MODE

0

表示進(jìn)行加密操作

DECRYPT_MODE

1

表示進(jìn)行解密操作

Key

密鑰(父類),在運(yùn)行密碼算法(如加解密)時(shí)需要提前生成其子類對象,并傳入Cipher實(shí)例的init()方法。

密鑰可以通過密鑰生成器來生成。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

format

string

密鑰的格式。

algName

string

密鑰對應(yīng)的算法名(含長度)。

getEncoded

getEncoded() : DataBlob

以同步方法,獲取16進(jìn)制形式的密鑰內(nèi)容。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

DataBlob

用于查看密鑰的具體內(nèi)容。

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. function uint8ArrayToShowStr(uint8Array) {
  3. return Array.prototype.map
  4. .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
  5. .join('');
  6. }
  7. let key; // key為使用對稱密鑰生成器 生成的密鑰,此處省略生成過程
  8. let encodedKey = key.getEncoded();
  9. console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data));

SymKey

對稱密鑰,是Key的子類,在對稱加解密時(shí)需要將其對象傳入Cipher實(shí)例的init()方法使用。

對稱密鑰可以通過對稱密鑰生成器SymKeyGenerator來生成。

clearMem

clearMem() : void

以同步方法,將系統(tǒng)底層內(nèi)存中的的密鑰內(nèi)容清零。建議在不再使用對稱密鑰實(shí)例時(shí),調(diào)用本函數(shù),避免內(nèi)存中密鑰數(shù)據(jù)存留過久。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. function uint8ArrayToShowStr(uint8Array) {
  3. return Array.prototype.map
  4. .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
  5. .join('');
  6. }
  7. let key; // key為使用對稱密鑰生成器 生成的密鑰,此處省略生成過程
  8. let encodedKey = key.getEncoded();
  9. console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data)); // 輸出密鑰內(nèi)容
  10. key.clearMem();
  11. encodedKey = key.getEncoded();
  12. console.info("key hex:" + uint8ArrayToShowStr(encodedKey.data)); // 輸出全零

PubKey

公鑰,是Key的子類,在非對稱加解密、驗(yàn)簽、密鑰協(xié)商時(shí)需要將其對象作為輸入使用。

公鑰可以通過非對稱密鑰生成器AsyKeyGenerator來生成。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

format

string

密鑰的格式。

algName

string

密鑰對應(yīng)的算法名(含長度)。

getEncoded

getEncoded() : DataBlob

以同步方法,獲取二進(jìn)制形式的密鑰內(nèi)容。公鑰格式滿足ASN.1語法、X.509規(guī)范、DER編碼格式。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

DataBlob

用于查看密鑰的具體內(nèi)容。

示例:

  1. function uint8ArrayToShowStr(uint8Array) {
  2. return Array.prototype.map
  3. .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
  4. .join('');
  5. }
  6. let key; // key為使用非對稱密鑰生成器生成的非對稱密鑰的公鑰對象,此處省略生成過程
  7. console.info("key format:" + key.format);
  8. console.info("key algName:" + key.algName);
  9. var encodedKey = key.getEncoded();
  10. console.info("key encoded:" + uint8ArrayToShowStr(encodedKey.data));

PriKey

私鑰,是Key的子類,在非對稱加解密、簽名、密鑰協(xié)商時(shí)需要將其作為輸入使用。

私鑰可以通過非對稱密鑰生成器AsyKeyGenerator來生成。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

format

string

密鑰的格式。

algName

string

密鑰對應(yīng)的算法名(含長度)。

getEncoded

getEncoded() : DataBlob

以同步方法,獲取二進(jìn)制形式的密鑰內(nèi)容。私鑰格式滿足ASN.1語法,PKCS#8規(guī)范、DER編碼方式。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

DataBlob

用于查看密鑰的具體內(nèi)容。

示例:

  1. function uint8ArrayToShowStr(uint8Array) {
  2. return Array.prototype.map
  3. .call(uint8Array, (x) => ('00' + x.toString(16)).slice(-2))
  4. .join('');
  5. }
  6. let key; // key為使用非對稱密鑰生成器生成的非對稱密鑰的私鑰對象,此處省略生成過程
  7. console.info("key format:" + key.format);
  8. console.info("key algName:" + key.algName);
  9. var encodedKey = key.getEncoded();
  10. console.info("key encoded:" + uint8ArrayToShowStr(encodedKey.data));

clearMem

clearMem() : void

以同步方法,將系統(tǒng)底層內(nèi)存中的的密鑰內(nèi)容清零。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

示例:

  1. let key; // key為使用非對稱密鑰生成器生成的非對稱密鑰的私鑰對象,此處省略生成過程
  2. key.clearMem();

KeyPair

非對稱密鑰對,包含:公鑰與私鑰。

可以通過非對稱密鑰生成器AsyKeyGenerator來生成。

說明

KeyPair對象中的pubKey對象和priKey對象,作為KeyPair對象中的一個(gè)參數(shù)存在,當(dāng)離開KeyPair對象作用域時(shí),其內(nèi)部對象可能被析構(gòu)。

業(yè)務(wù)方使用時(shí)應(yīng)持有KeyPair對象的引用,而非內(nèi)部pubKey或priKey對象的引用。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

priKey

PriKey

私鑰。

pubKey

PubKey

公鑰。

cryptoFramework.createSymKeyGenerator

createSymKeyGenerator(algName : string) : SymKeyGenerator

通過指定算法名稱的字符串,獲取相應(yīng)的對稱密鑰生成器實(shí)例。

支持的規(guī)格詳見框架概述“密鑰生成規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

待生成對稱密鑰生成器的算法名稱。

具體取值詳見框架概述“密鑰生成規(guī)格”一節(jié)中的“字符串參數(shù)”。

返回值:

類型

說明

SymKeyGenerator

返回對稱密鑰生成器的對象。

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let symKeyGenerator = cryptoFramework.createSymKeyGenerator('3DES192');

SymKeyGenerator

對稱密鑰生成器。

在使用該類的方法前,需要先使用createSymKeyGenerator方法構(gòu)建一個(gè)symKeyGenerator實(shí)例。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

對稱密鑰生成器指定的算法名稱。

generateSymKey

generateSymKey(callback : AsyncCallback<SymKey>) : void

異步獲取對稱密鑰生成器隨機(jī)生成的密鑰,通過注冊回調(diào)函數(shù)獲取結(jié)果。

必須在使用createSymKeyGenerator創(chuàng)建對稱密鑰生成器后,才能使用本函數(shù)。

目前支持使用OpenSSL的RAND_priv_bytes()作為底層能力生成隨機(jī)密鑰。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

callback

AsyncCallback<SymKey>

回調(diào)函數(shù)。當(dāng)生成對稱密鑰成功,err為undefined,data為獲取到的SymKey;否則為錯(cuò)誤對象。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let symAlgName = '3DES192';
  3. let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
  4. symKeyGenerator.generateSymKey((err, symKey) => {
  5. if (err) {
  6. console.error(`Generate symKey failed, ${err.code}, ${err.message}`);
  7. } else {
  8. console.info(`Generate symKey success, algName: ${symKey.algName}`);
  9. }
  10. })

generateSymKey

generateSymKey() : Promise<SymKey>

異步獲取該對稱密鑰生成器隨機(jī)生成的密鑰,通過Promise獲取結(jié)果。

必須在使用createSymKeyGenerator創(chuàng)建對稱密鑰生成器后,才能使用本函數(shù)。

目前支持使用OpenSSL的RAND_priv_bytes()作為底層能力生成隨機(jī)密鑰。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

Promise<SymKey>

Promise對象,返回對稱密鑰SymKey。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let symAlgName = 'AES128';
  3. let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
  4. symKeyGenerator.generateSymKey()
  5. .then(symKey => {
  6. console.info(`Generate symKey success, algName: ${symKey.algName}`);
  7. }, error => {
  8. console.error(`Generate symKey failed, ${error.code}, ${error.message}`);
  9. })

convertKey

convertKey(key : DataBlob, callback : AsyncCallback<SymKey>) : void

異步根據(jù)指定數(shù)據(jù)生成對稱密鑰,通過注冊回調(diào)函數(shù)獲取結(jié)果。

必須在使用createSymKeyGenerator創(chuàng)建對稱密鑰生成器后,才能使用本函數(shù)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

key

DataBlob

指定的對稱密鑰材料。

callback

AsyncCallback<SymKey>

回調(diào)函數(shù)。當(dāng)生成對稱密鑰成功,err為undefined,data為獲取到的SymKey;否則為錯(cuò)誤對象。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. function genKeyMaterialBlob() {
  3. let arr = [
  4. 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
  5. 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
  6. 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes)
  7. let keyMaterial = new Uint8Array(arr);
  8. return {data : keyMaterial};
  9. }
  10. let symAlgName = '3DES192';
  11. let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
  12. let keyMaterialBlob = genKeyMaterialBlob();
  13. symKeyGenerator.convertKey(keyMaterialBlob, (err, symKey) => {
  14. if (err) {
  15. console.error(`Convert symKey failed, ${err.code}, ${err.message}`);
  16. } else {
  17. console.info(`Convert symKey success, algName: ${symKey.algName}`);
  18. }
  19. })

convertKey

convertKey(key : DataBlob) : Promise<SymKey>

異步根據(jù)指定數(shù)據(jù)生成對稱密鑰,通過Promise獲取結(jié)果。

必須在使用createSymKeyGenerator創(chuàng)建對稱密鑰生成器后,才能使用本函數(shù)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

key

DataBlob

指定的密鑰材料數(shù)據(jù)。

返回值:

類型

說明

Promise<SymKey>

Promise對象,返回對稱密鑰SymKey。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. function genKeyMaterialBlob() {
  3. let arr = [
  4. 0xba, 0x3d, 0xc2, 0x71, 0x21, 0x1e, 0x30, 0x56,
  5. 0xad, 0x47, 0xfc, 0x5a, 0x46, 0x39, 0xee, 0x7c,
  6. 0xba, 0x3b, 0xc2, 0x71, 0xab, 0xa0, 0x30, 0x72]; // keyLen = 192 (24 bytes)
  7. let keyMaterial = new Uint8Array(arr);
  8. return {data : keyMaterial};
  9. }
  10. let symAlgName = '3DES192';
  11. let symKeyGenerator = cryptoFramework.createSymKeyGenerator(symAlgName);
  12. let keyMaterialBlob = genKeyMaterialBlob();
  13. symKeyGenerator.convertKey(keyMaterialBlob)
  14. .then(symKey => {
  15. console.info(`Convert symKey success, algName: ${symKey.algName}`);
  16. }, error => {
  17. console.error(`Convert symKey failed, ${error.code}, ${error.message}`);
  18. })

cryptoFramework.createAsyKeyGenerator

createAsyKeyGenerator(algName : string) : AsyKeyGenerator

通過指定算法名稱的字符串,獲取相應(yīng)的非對稱密鑰生成器實(shí)例。

支持的規(guī)格詳見框架概述“密鑰生成規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

待生成對稱密鑰生成器的算法名稱。

返回值:

類型

說明

AsyKeyGenerator

返回非對稱密鑰生成器的對象。

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");

AsyKeyGenerator

非對稱密鑰生成器。在使用該類的方法前,需要先使用createAsyKeyGenerator()方法構(gòu)建一個(gè)AsyKeyGenerator實(shí)例。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

非對稱密鑰生成器指定的算法名稱。

generateKeyPair

generateKeyPair(callback : AsyncCallback<KeyPair>) : void;

異步獲取非對稱密鑰生成器隨機(jī)生成的密鑰,通過注冊回調(diào)函數(shù)獲取結(jié)果。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

callback

AsyncCallback<KeyPair>

回調(diào)函數(shù),用于獲取非對稱密鑰。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
  3. asyKeyGenerator.generateKeyPair((err, keyPair) => {
  4. if (err) {
  5. console.error("generateKeyPair: error.");
  6. return;
  7. }
  8. console.info("generateKeyPair: success.");
  9. })

generateKeyPair

generateKeyPair() : Promise<KeyPair>

異步獲取該非對稱密鑰生成器隨機(jī)生成的密鑰,通過Promise獲取結(jié)果。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

返回值:

類型

說明

Promise<KeyPair>

使用Promise的方式獲取非對稱密鑰。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
  3. let keyGenPromise = asyKeyGenerator.generateKeyPair();
  4. keyGenPromise.then( keyPair => {
  5. console.info("generateKeyPair success.");
  6. }).catch(error => {
  7. console.error("generateKeyPair error.");
  8. });

convertKey

convertKey(pubKey : DataBlob, priKey : DataBlob, callback : AsyncCallback<KeyPair>) : void

異步獲取指定數(shù)據(jù)生成非對稱密鑰,通過注冊回調(diào)函數(shù)獲取結(jié)果。詳情請看下方密鑰轉(zhuǎn)換說明

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

pubKey

DataBlob

指定的公鑰材料。如果公鑰不需要轉(zhuǎn)換,可直接傳入null。

priKey

DataBlob

指定的私鑰材料。如果私鑰不需要轉(zhuǎn)換,可直接傳入null。

callback

AsyncCallback<KeyPair>

回調(diào)函數(shù),用于獲取非對稱密鑰。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let pubKey; // X.509規(guī)范、DER格式的公鑰數(shù)據(jù),此處省略數(shù)據(jù)。
  3. let priKey; // PKCS#8規(guī)范、DER格式的私鑰數(shù)據(jù),此處省略數(shù)據(jù)。
  4. let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
  5. asyKeyGenerator.convertKey(pubKey, priKey, (err, keyPair) => {
  6. if (err) {
  7. console.error("convertKey: error.");
  8. return;
  9. }
  10. console.info("convertKey: success.");
  11. })

convertKey

convertKey(pubKey : DataBlob, priKey : DataBlob) : Promise<KeyPair>

異步獲取指定數(shù)據(jù)生成非對稱密鑰,通過Promise獲取結(jié)果。詳情請看下方密鑰轉(zhuǎn)換說明

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

pubKey

DataBlob

指定的公鑰材料。如果公鑰不需要轉(zhuǎn)換,可直接傳入null

priKey

DataBlob

指定的私鑰材料。如果私鑰不需要轉(zhuǎn)換,可直接傳入null

返回值:

類型

說明

Promise<KeyPair>

使用Promise的方式獲取非對稱密鑰。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let asyKeyGenerator = cryptoFramework.createAsyKeyGenerator("ECC256");
  3. let pubKey; // pubKey為使用非對稱密鑰生成器生成的非對稱密鑰的公鑰對象,此處省略生成過程
  4. let priKey; // priKey為使用非對稱密鑰生成器生成的非對稱密鑰的私鑰對象,此處省略生成過程
  5. let keyGenPromise = asyKeyGenerator.convertKey(pubKey, priKey);
  6. keyGenPromise.then( keyPair => {
  7. console.info("convertKey success.");
  8. }).catch(error => {
  9. console.error("convertKey error.");
  10. });

密鑰轉(zhuǎn)換說明

  1. 非對稱密鑰(RSA、ECC)的公鑰和私鑰調(diào)用getEncoded()方法后,分別返回X.509格式和PKCS#8格式的二進(jìn)制數(shù)據(jù),此數(shù)據(jù)可用于跨應(yīng)用傳輸或持久化存儲。
  2. 當(dāng)調(diào)用convertKey方法將外來二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為算法庫非對稱密鑰對象時(shí),公鑰應(yīng)滿足ASN.1語法、X.509規(guī)范、DER編碼格式,私鑰應(yīng)滿足ASN.1語法、PKCS#8規(guī)范、DER編碼格式。
  3. convertKey方法中,公鑰和密鑰二進(jìn)制數(shù)據(jù)非必選項(xiàng),可單獨(dú)傳入公鑰或私鑰的數(shù)據(jù),生成對應(yīng)只包含公鑰或私鑰的KeyPair對象。

cryptoFramework.createCipher

createCipher(transformation : string) : Cipher

通過指定算法名稱,獲取相應(yīng)的Cipher實(shí)例。

支持的規(guī)格詳見框架概述“加解密規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

transformation

string

待生成Cipher的算法名稱(含密鑰長度)、加密模式以及填充方法的組合。

具體取值詳見框架概述“加解密規(guī)格”一節(jié)中的“字符串參數(shù)”。

說明
  1. 目前對稱加解密中,PKCS5和PKCS7的實(shí)現(xiàn)相同,其padding長度和分組長度保持一致(即PKCS5和PKCS7在3DES中均按照8字節(jié)填充,在AES中均按照16字節(jié)填充),另有NoPadding表示不填充。

    開發(fā)者需要自行了解密碼學(xué)不同分組模式的差異,以便選擇合適的參數(shù)規(guī)格。例如選擇ECB和CBC模式時(shí),建議啟用填充,否則必須確保明文長度是分組大小的整數(shù)倍;選擇其他模式時(shí),可以不啟用填充,此時(shí)密文長度和明文長度一致(即可能不是分組大小的整數(shù)倍)。

  2. 使用RSA進(jìn)行非對稱加解密時(shí),必須創(chuàng)建兩個(gè)Cipher對象分別進(jìn)行加密和解密操作,而不能對同一個(gè)Cipher對象進(jìn)行加解密。對稱加解密沒有此要求(即只要算法規(guī)格一樣,可以對同一個(gè)Cipher對象進(jìn)行加解密操作)。

返回值:

類型

說明

Cipher

返回加解密生成器的對象。

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let cipherAlgName = '3DES192|ECB|PKCS7';
  3. var cipher;
  4. try {
  5. cipher = cryptoFramework.createCipher(cipherAlgName);
  6. console.info(`cipher algName: ${cipher.algName}`);
  7. } catch (error) {
  8. console.error(`createCipher failed, ${error.code}, ${error.message}`);
  9. }

Cipher

提供加解密的算法操作功能,按序調(diào)用本類中的init()、update()、doFinal()方法,可以實(shí)現(xiàn)對稱加密/對稱解密/非對稱加密/非對稱解密。

完整的加解密流程示例可參考開發(fā)指導(dǎo)中的“使用加解密操作”一節(jié)。

一次完整的加/解密流程在對稱加密和非對稱加密中略有不同:

  • 對稱加解密:init為必選,update為可選(且允許多次update加/解密大數(shù)據(jù)),doFinal為必選;doFinal結(jié)束后可以重新init開始新一輪加/解密流程。
  • RSA非對稱加解密:init為必選,不支持update操作,doFinal為必選(允許連續(xù)多次doFinal加/解密大數(shù)據(jù));RSA不支持重復(fù)init,切換加解密模式或填充方式時(shí),需要重新創(chuàng)建Cipher對象。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

加解密生成器指定的算法名稱。

init

init(opMode : CryptoMode, key : Key, params : ParamsSpec, callback : AsyncCallback<void>) : void

初始化加解密的cipher對象,通過注冊回調(diào)函數(shù)獲取結(jié)果。

必須在使用createCipher創(chuàng)建Cipher實(shí)例后,才能使用本函數(shù)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

opMode

CryptoMode

加密或者解密模式。

key

Key

指定加密或解密的密鑰。

params

ParamsSpec

指定加密或解密的參數(shù),對于ECB等沒有參數(shù)的算法模式,可以傳入null。

callback

AsyncCallback<void>

回調(diào)函數(shù)。當(dāng)初始化成功,err為undefined,否則為錯(cuò)誤對象。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let symKey; // 此處省略生成對稱密鑰的過程
  3. let cipher; // 此處省略生成cipher實(shí)例的過程
  4. cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null, (err, ) => {
  5. if (err) {
  6. console.error(`Failed to init cipher, ${err.code}, ${err.message}`);
  7. } else {
  8. console.info(`Init cipher success`);
  9. // 此處進(jìn)行update等后續(xù)操作
  10. }
  11. })

init

init(opMode : CryptoMode, key : Key, params : ParamsSpec) : Promise<void>

初始化加解密的cipher對象,通過Promise獲取結(jié)果。

必須在使用createCipher創(chuàng)建Cipher實(shí)例后,才能使用本函數(shù)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

opMode

CryptoMode

加密或者解密模式。

key

Key

指定加密或解密的密鑰。

params

ParamsSpec

指定加密或解密的參數(shù),對于ECB等沒有參數(shù)的算法模式,可以傳入null。

返回值:

類型

說明

Promise<void>

Promise對象。無返回結(jié)果的Promise對象。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let symKey; // 此處省略生成對稱密鑰的過程
  3. let cipher; // 此處省略生成cipher實(shí)例的過程
  4. cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null)
  5. .then(() => {
  6. console.info(`Init cipher success`);
  7. // 此處進(jìn)行update等后續(xù)操作
  8. }, error => {
  9. console.error(`Failed to init cipher, ${error.code}, ${error.message}`);
  10. })

update

update(data : DataBlob, callback : AsyncCallback<DataBlob>) : void

分段更新加密或者解密數(shù)據(jù)操作,通過注冊回調(diào)函數(shù)獲取加/解密數(shù)據(jù)。

必須在對Cipher實(shí)例使用init()初始化后,才能使用本函數(shù)。

說明
  1. 在進(jìn)行對稱加解密操作的時(shí)候,如果開發(fā)者對各個(gè)分組模式不夠熟悉,建議對每次update和doFinal的結(jié)果都判斷是否為null,并在結(jié)果不為null時(shí)取出其中的數(shù)據(jù)進(jìn)行拼接,形成完整的密文/明文。這是因?yàn)檫x擇的分組模式等各項(xiàng)規(guī)格都可能對update和doFinal結(jié)果產(chǎn)生影響。

    (例如對于ECB和CBC模式,不論update傳入的數(shù)據(jù)是否為分組長度的整數(shù)倍,都會以分組作為基本單位進(jìn)行加/解密,并輸出本次update新產(chǎn)生的加/解密分組結(jié)果。

    可以理解為,update只要湊滿一個(gè)新的分組就會有輸出,如果沒有湊滿則此次update輸出為null,把當(dāng)前還沒被加/解密的數(shù)據(jù)留著,等下一次update/doFinal傳入數(shù)據(jù)的時(shí)候,拼接起來繼續(xù)湊分組。

    最后doFinal的時(shí)候,會把剩下的還沒加/解密的數(shù)據(jù),根據(jù)createCipher時(shí)設(shè)置的padding模式進(jìn)行填充,補(bǔ)齊到分組的整數(shù)倍長度,再輸出剩余加解密結(jié)果。

    而對于可以將分組密碼轉(zhuǎn)化為流模式實(shí)現(xiàn)的模式,還可能出現(xiàn)密文長度和明文長度相同的情況等。)

  2. 根據(jù)數(shù)據(jù)量,可以不調(diào)用update(即init完成后直接調(diào)用doFinal)或多次調(diào)用update。

    算法庫目前沒有對update(單次或累計(jì))的數(shù)據(jù)量設(shè)置大小限制,建議對于大數(shù)據(jù)量的對稱加解密,采用多次update的方式傳入數(shù)據(jù)。

    AES使用多次update操作的示例代碼詳見開發(fā)指導(dǎo)“使用加解密操作”。

  3. RSA非對稱加解密不支持update操作。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

加密或者解密的數(shù)據(jù)。data不能為null,也不允許傳入{data : Uint8Array(空) }

callback

AsyncCallback<DataBlob>

回調(diào)函數(shù)。當(dāng)更新加/解密數(shù)據(jù)成功,err為undefined,data為此次更新的加/解密結(jié)果DataBlob;否則為錯(cuò)誤對象。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. function stringToUint8Array(str) {
  3. let arr = [];
  4. for (let i = 0, j = str.length; i < j; ++i) {
  5. arr.push(str.charCodeAt(i));
  6. }
  7. return new Uint8Array(arr);
  8. }
  9. let cipher; // 此處省略生成cipher實(shí)例的過程
  10. // 此處省略init()過程
  11. let plainText = {data : stringToUint8Array('this is test!')};
  12. cipher.update(plainText, (err, output) => { // 加密過程舉例
  13. if (err) {
  14. console.error(`Failed to update cipher`);
  15. } else {
  16. console.info(`Update cipher success`);
  17. if (output != null) {
  18. // 拼接output.data到密文
  19. }
  20. // 此處進(jìn)行doFinal等后續(xù)操作
  21. }
  22. })

update

update(data : DataBlob) : Promise<DataBlob>

分段更新加密或者解密數(shù)據(jù)操作,通過Promise獲取加/解密數(shù)據(jù)。

必須在對Cipher實(shí)例使用init()初始化后,才能使用本函數(shù)。

說明
  1. 在進(jìn)行對稱加解密操作的時(shí)候,如果開發(fā)者對各個(gè)分組模式不夠熟悉,建議對每次update和doFinal的結(jié)果都判斷是否為null,并在結(jié)果不為null時(shí)取出其中的數(shù)據(jù)進(jìn)行拼接,形成完整的密文/明文。這是因?yàn)檫x擇的分組模式等各項(xiàng)規(guī)格都可能對update和doFinal結(jié)果產(chǎn)生影響。

    (例如對于ECB和CBC模式,不論update傳入的數(shù)據(jù)是否為分組長度的整數(shù)倍,都會以分組作為基本單位進(jìn)行加/解密,并輸出本次update新產(chǎn)生的加/解密分組結(jié)果。

    可以理解為,update只要湊滿一個(gè)新的分組就會有輸出,如果沒有湊滿則此次update輸出為null,把當(dāng)前還沒被加/解密的數(shù)據(jù)留著,等下一次update/doFinal傳入數(shù)據(jù)的時(shí)候,拼接起來繼續(xù)湊分組。

    最后doFinal的時(shí)候,會把剩下的還沒加/解密的數(shù)據(jù),根據(jù)createCipher時(shí)設(shè)置的padding模式進(jìn)行填充,補(bǔ)齊到分組的整數(shù)倍長度,再輸出剩余加解密結(jié)果。

    而對于可以將分組密碼轉(zhuǎn)化為流模式實(shí)現(xiàn)的模式,還可能出現(xiàn)密文長度和明文長度相同的情況等。)

  2. 根據(jù)數(shù)據(jù)量,可以不調(diào)用update(即init完成后直接調(diào)用doFinal)或多次調(diào)用update。

    算法庫目前沒有對update(單次或累計(jì))的數(shù)據(jù)量設(shè)置大小限制,建議對于大數(shù)據(jù)量的對稱加解密,可以采用多次update的方式傳入數(shù)據(jù)。

    AES使用多次update操作的示例代碼詳見開發(fā)指導(dǎo)“使用加解密操作”。

  3. RSA非對稱加解密不支持update操作。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

加密或者解密的數(shù)據(jù)。data不能為null,也不允許傳入{data : Uint8Array(空) }

返回值:

類型

說明

Promise<DataBlob>

Promise對象,返回此次更新的加/解密結(jié)果DataBlob。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. function stringToUint8Array(str) {
  3. let arr = [];
  4. for (let i = 0, j = str.length; i < j; ++i) {
  5. arr.push(str.charCodeAt(i));
  6. }
  7. return new Uint8Array(arr);
  8. }
  9. let cipher; // 此處省略生成cipher實(shí)例的過程
  10. // 此處省略init()過程
  11. let plainText = {data : stringToUint8Array('this is test!')};
  12. cipher.update(plainText)
  13. .then((output) => {
  14. console.info(`Update cipher success.`);
  15. if (output != null) {
  16. // 拼接output.data到密文
  17. }
  18. // 此處進(jìn)行doFinal等后續(xù)操作
  19. }, error => {
  20. console.info(`Update cipher failed.`);
  21. })

doFinal

doFinal(data : DataBlob, callback : AsyncCallback<DataBlob>) : void

(1)在對稱加解密中,doFinal加/解密(分組模式產(chǎn)生的)剩余數(shù)據(jù)和本次傳入的數(shù)據(jù),最后結(jié)束加密或者解密數(shù)據(jù)操作,通過注冊回調(diào)函數(shù)獲取加密或者解密數(shù)據(jù)。

如果數(shù)據(jù)量較小,可以在doFinal中一次性傳入數(shù)據(jù),而不使用update;如果在本次加解密流程中,已經(jīng)使用update傳入過數(shù)據(jù),可以在doFinal的data參數(shù)處傳入null。

根據(jù)對稱加解密的模式不同,doFinal的輸出有如下區(qū)別:

  • 對于GCM和CCM模式的對稱加密:一次加密流程中,如果將每一次update和doFinal的結(jié)果拼接起來,會得到“密文+authTag”,即末尾的16字節(jié)(GCM模式)或12字節(jié)(CCM模式)是authTag,而其余部分均為密文。(也就是說,如果doFinal的data參數(shù)傳入null,則doFinal的結(jié)果就是authTag)

    authTag需要填入解密時(shí)的GcmParamsSpecCcmParamsSpec;密文則作為解密時(shí)的入?yún)ata。

  • 對于其他模式的對稱加解密、GCM和CCM模式的對稱解密:一次加/解密流程中,每一次update和doFinal的結(jié)果拼接起來,得到完整的明文/密文。

(2)在RSA非對稱加解密中,doFinal加/解密本次傳入的數(shù)據(jù),通過注冊回調(diào)函數(shù)獲取加密或者解密數(shù)據(jù)。如果數(shù)據(jù)量較大,可以多次調(diào)用doFinal,拼接結(jié)果得到完整的明文/密文。

說明
  1. 對稱加解密中,調(diào)用doFinal標(biāo)志著一次加解密流程已經(jīng)完成,即Cipher實(shí)例的狀態(tài)被清除,因此當(dāng)后續(xù)開啟新一輪加解密流程時(shí),需要重新調(diào)用init()并傳入完整的參數(shù)列表進(jìn)行初始化

    (比如即使是對同一個(gè)Cipher實(shí)例,采用同樣的對稱密鑰,進(jìn)行加密然后解密,則解密中調(diào)用init的時(shí)候仍需填寫params參數(shù),而不能直接省略為null)。

  2. 如果遇到解密失敗,需檢查加解密數(shù)據(jù)和init時(shí)的參數(shù)是否匹配,包括GCM模式下加密得到的authTag是否填入解密時(shí)的GcmParamsSpec等。
  3. doFinal的結(jié)果可能為null,因此使用.data字段訪問doFinal結(jié)果的具體數(shù)據(jù)前,請記得先判斷結(jié)果是否為null,避免產(chǎn)生異常。
  4. RSA非對稱加解密時(shí)多次doFinal操作的示例代碼詳見開發(fā)指導(dǎo)“使用加解密操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

加密或者解密的數(shù)據(jù)。在對稱加解密中允許為null,但不允許傳入{data : Uint8Array(空) }。

callback

AsyncCallback<DataBlob>

回調(diào)函數(shù)。當(dāng)最終加/解密數(shù)據(jù)成功,err為undefined,data為剩余數(shù)據(jù)的加/解密結(jié)果DataBlob;否則為錯(cuò)誤對象。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let cipher; // 此處省略生成cipher實(shí)例的過程
  3. let data; // 此處省略準(zhǔn)備待加密/解密數(shù)據(jù)的過程
  4. // 此處省略init()和update()過程
  5. cipher.doFinal(data, (err, output) => {
  6. if (err) {
  7. console.error(`Failed to finalize cipher, ${err.code}, ${err.message}`);
  8. } else {
  9. console.info(`Finalize cipher success`);
  10. if (output != null) {
  11. // 拼接output.data得到完整的明文/密文(及authTag)
  12. }
  13. }
  14. })

doFinal

doFinal(data : DataBlob) : Promise<DataBlob>

(1)在對稱加解密中,doFinal加/解密(分組模式產(chǎn)生的)剩余數(shù)據(jù)和本次傳入的數(shù)據(jù),最后結(jié)束加密或者解密數(shù)據(jù)操作,通過Promise獲取加密或者解密數(shù)據(jù)。

如果數(shù)據(jù)量較小,可以在doFinal中一次性傳入數(shù)據(jù),而不使用update;如果在本次加解密流程中,已經(jīng)使用update傳入過數(shù)據(jù),可以在doFinal的data參數(shù)處傳入null。

根據(jù)對稱加解密的模式不同,doFinal的輸出有如下區(qū)別:

  • 對于GCM和CCM模式的對稱加密:一次加密流程中,如果將每一次update和doFinal的結(jié)果拼接起來,會得到“密文+authTag”,即末尾的16字節(jié)(GCM模式)或12字節(jié)(CCM模式)是authTag,而其余部分均為密文。(也就是說,如果doFinal的data參數(shù)傳入null,則doFinal的結(jié)果就是authTag)

    authTag需要填入解密時(shí)的GcmParamsSpecCcmParamsSpec;密文則作為解密時(shí)的入?yún)ata。

  • 對于其他模式的對稱加解密、GCM和CCM模式的對稱解密:一次加/解密流程中,每一次update和doFinal的結(jié)果拼接起來,得到完整的明文/密文。

(2)在RSA非對稱加解密中,doFinal加/解密本次傳入的數(shù)據(jù),通過Promise獲取加密或者解密數(shù)據(jù)。如果數(shù)據(jù)量較大,可以多次調(diào)用doFinal,拼接結(jié)果得到完整的明文/密文。

說明
  1. 對稱加解密中,調(diào)用doFinal標(biāo)志著一次加解密流程已經(jīng)完成,即Cipher實(shí)例的狀態(tài)被清除,因此當(dāng)后續(xù)開啟新一輪加解密流程時(shí),需要重新調(diào)用init()并傳入完整的參數(shù)列表進(jìn)行初始化

    (比如即使是對同一個(gè)Cipher實(shí)例,采用同樣的對稱密鑰,進(jìn)行加密然后解密,則解密中調(diào)用init的時(shí)候仍需填寫params參數(shù),而不能直接省略為null)。

  2. 如果遇到解密失敗,需檢查加解密數(shù)據(jù)和init時(shí)的參數(shù)是否匹配,包括GCM模式下加密得到的authTag是否填入解密時(shí)的GcmParamsSpec等。
  3. doFinal的結(jié)果可能為null,因此使用.data字段訪問doFinal結(jié)果的具體數(shù)據(jù)前,請記得先判斷結(jié)果是否為null,避免產(chǎn)生異常。
  4. RSA非對稱加解密時(shí)多次doFinal操作的示例代碼詳見開發(fā)指導(dǎo)“使用加解密操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

加密或者解密的數(shù)據(jù)。data參數(shù)允許為null,但不允許傳入{data : Uint8Array(空) }

返回值:

類型

說明

Promise<DataBlob>

Promise對象,返回剩余數(shù)據(jù)的加/解密結(jié)果DataBlob。

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

示例:

  1. import cryptoFramework from '@ohos.security.cryptoFramework';
  2. let cipher; // 此處省略生成cipher實(shí)例的過程
  3. let data; // 此處省略準(zhǔn)備待加密/解密數(shù)據(jù)的過程
  4. // 此處省略init()和update()過程
  5. cipher.doFinal(data)
  6. .then(output => {
  7. console.info(`Finalize cipher success`);
  8. if (output != null) {
  9. // 拼接output.data得到完整的明文/密文(及authTag)
  10. }
  11. }, error => {
  12. console.error(`Failed to finalize cipher, ${error.code}, ${error.message}`);
  13. })

使用RSA加密的callback完整示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. function stringToUint8Array(str) {
  3. let arr = [];
  4. for (let i = 0, j = str.length; i < j; ++i) {
  5. arr.push(str.charCodeAt(i));
  6. }
  7. return new Uint8Array(arr);
  8. }
  9. let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
  10. let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
  11. rsaGenerator.generateKeyPair(function (err, keyPair) {
  12. let pubKey = keyPair.pubKey;
  13. cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null, function (err, data) {
  14. let plainText = "this is cipher text";
  15. let input = {data : stringToUint8Array(plainText) };
  16. cipher.doFinal(input, function (err, data) {
  17. AlertDialog.show({ message : "EncryptOutPut is " + data.data} );
  18. });
  19. });
  20. });

使用RSA加密的promise完整示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. function stringToUint8Array(str) {
  3. let arr = [];
  4. for (let i = 0, j = str.length; i < j; ++i) {
  5. arr.push(str.charCodeAt(i));
  6. }
  7. return new Uint8Array(arr);
  8. }
  9. let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
  10. let cipher = cryptoFramework.createCipher("RSA1024|PKCS1");
  11. let keyGenPromise = rsaGenerator.generateKeyPair();
  12. keyGenPromise.then(rsaKeyPair => {
  13. let pubKey = rsaKeyPair.pubKey;
  14. return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, pubKey, null); // 傳入私鑰和DECRYPT_MODE可初始化解密模式
  15. }).then(() => {
  16. let plainText = "this is cipher text";
  17. let input = { data : stringToUint8Array(plainText) };
  18. return cipher.doFinal(input);
  19. }).then(dataBlob => {
  20. console.info("EncryptOutPut is " + dataBlob.data);
  21. });
說明

更多加解密流程的完整示例可參考開發(fā)指導(dǎo)中的“使用加解密操作”一節(jié)。

cryptoFramework.createSign

createSign(algName : string) : Sign

Sign實(shí)例生成。

支持的規(guī)格詳見框架概述“簽名驗(yàn)簽規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

指定簽名算法:RSA或ECC,使用RSA PKCS1模式時(shí)需要設(shè)置摘要,使用RSA PSS模式時(shí)需要設(shè)置摘要和掩碼摘要

返回值

類型

說明

Sign

返回由輸入算法指定生成的Sign對象

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let signer1 = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
  3. let singer2 = cryptoFramework.createSign("RSA1024|PSS|SHA256|MGF1_SHA256")

Sign

Sign類,使用Sign方法之前需要?jiǎng)?chuàng)建該類的實(shí)例進(jìn)行操作,通過createSign(algName : string) : Sign方法構(gòu)造此實(shí)例。Sign類不支持重復(fù)初始化,當(dāng)業(yè)務(wù)方需要使用新密鑰簽名時(shí),需要重新創(chuàng)建新Sign對象并調(diào)用init初始化。

業(yè)務(wù)方使用時(shí),在createSign時(shí)確定簽名的模式,調(diào)用init接口設(shè)置密鑰。

當(dāng)待簽名數(shù)據(jù)較短時(shí),可在init初始化后直接調(diào)用sign接口傳入原文數(shù)據(jù)進(jìn)行簽名。

當(dāng)待簽名數(shù)據(jù)較長時(shí),可通過update接口分段傳入切分后的原文數(shù)據(jù),最后調(diào)用sign接口對整體原文數(shù)據(jù)進(jìn)行簽名。

當(dāng)使用update分段傳入原文時(shí),sign接口支持傳null,業(yè)務(wù)方可在循環(huán)中調(diào)用update接口,循環(huán)結(jié)束后調(diào)用sign進(jìn)行簽名。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

簽名指定的算法名稱。

init

init(priKey : PriKey, callback : AsyncCallback<void>) : void

使用私鑰初始化Sign對象,Callback形式,Sign類暫不支持重復(fù)init

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

priKey

PriKey

用于Sign的初始化

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

init

init(priKey : PriKey) : Promise<void>

使用私鑰初始化Sign對象,Promise形式,Sign類暫不支持重復(fù)init

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

priKey

PriKey

用于Sign的初始化

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

update

update(data : DataBlob, callback : AsyncCallback<void>) : void

追加待簽名數(shù)據(jù),callback方式

說明

Sign多次調(diào)用update的代碼示例詳見開發(fā)指導(dǎo)“使用簽名驗(yàn)簽操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

update

update(data : DataBlob) : Promise<void>;

追加待簽名數(shù)據(jù),promise方式

說明

Sign多次調(diào)用update的代碼示例詳見開發(fā)指導(dǎo)“使用簽名驗(yàn)簽操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

sign

sign(data : DataBlob, callback : AsyncCallback<DataBlob>) : void

對數(shù)據(jù)進(jìn)行簽名,返回簽名結(jié)果,callback方式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

callback

AsyncCallback<DataBlob >

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

sign

sign(data : DataBlob) : Promise<DataBlob>

對數(shù)據(jù)進(jìn)行簽名,返回簽名結(jié)果,promise方式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

callback示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. function stringToUint8Array(str) {
  3. var arr = [];
  4. for (var i = 0, j = str.length; i < j; ++i) {
  5. arr.push(str.charCodeAt(i));
  6. }
  7. var tmpArray = new Uint8Array(arr);
  8. return tmpArray;
  9. }
  10. let globalKeyPair;
  11. let SignMessageBlob;
  12. let plan1 = "This is Sign test plan1"; // The first segment of data.
  13. let plan2 = "This is Sign test plan2"; // The second segment of fata.
  14. let input1 = { data : stringToUint8Array(plan1) };
  15. let input2 = { data : stringToUint8Array(plan2) };
  16. function signMessageCallback() {
  17. let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
  18. let signer = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
  19. rsaGenerator.generateKeyPair(function (err, keyPair) {
  20. globalKeyPair = keyPair;
  21. let priKey = globalKeyPair.priKey;
  22. signer.init(priKey, function (err, data) {
  23. signer.update(input1, function (err, data) { // add first segment of data
  24. signer.sign(input2, function (err, data) { // add second segment of data, sign input1 and input2
  25. SignMessageBlob = data;
  26. AlertDialog.show({message : "res" + SignMessageBlob.data});
  27. });
  28. });
  29. });
  30. });
  31. }

promise示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. function stringToUint8Array(str) {
  3. var arr = [];
  4. for (var i = 0, j = str.length; i < j; ++i) {
  5. arr.push(str.charCodeAt(i));
  6. }
  7. var tmpArray = new Uint8Array(arr);
  8. return tmpArray;
  9. }
  10. let globalKeyPair;
  11. let SignMessageBlob;
  12. let plan1 = "This is Sign test plan1"; // The first segment of data.
  13. let plan2 = "This is Sign test plan2"; // The second segment of fata.
  14. let input1 = { data : stringToUint8Array(plan1) };
  15. let input2 = { data : stringToUint8Array(plan2) };
  16. function signMessagePromise() {
  17. let rsaGenerator = cryptoFramework.createAsyKeyGenerator("RSA1024|PRIMES_2");
  18. let signer = cryptoFramework.createSign("RSA1024|PKCS1|SHA256");
  19. let keyGenPromise = rsaGenerator.generateKeyPair();
  20. keyGenPromise.then( keyPair => {
  21. globalKeyPair = keyPair;
  22. let priKey = globalKeyPair.priKey;
  23. return signer.init(priKey);
  24. }).then(() => {
  25. return signer.update(input1); // add first segment of data
  26. }).then(() => {
  27. return signer.sign(input2); // add second segment of data, sign input1 and input2
  28. }).then(dataBlob => {
  29. SignMessageBlob = dataBlob;
  30. console.info("sign output is " + SignMessageBlob.data);
  31. AlertDialog.show({message : "output" + SignMessageBlob.data});
  32. });
  33. }

cryptoFramework.createVerify

createVerify(algName : string) : Verify

Verify實(shí)例生成。

支持的規(guī)格詳見框架概述“簽名驗(yàn)簽規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

指定簽名算法:RSA或ECC,使用RSA PKCS1模式時(shí)需要設(shè)置摘要,使用RSA PSS模式時(shí)需要設(shè)置摘要和掩碼摘要

返回值

類型

說明

Verify

返回由輸入算法指定生成的Verify對象

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let verifyer1 = cryptoFramework.createVerify("RSA1024|PKCS1|SHA256");
  3. let verifyer2 = cryptoFramework.createVerify("RSA1024|PSS|SHA256|MGF1_SHA256")

Verify

Verify類,使用Verify方法之前需要?jiǎng)?chuàng)建該類的實(shí)例進(jìn)行操作,通過createVerify(algName : string) : Verify方法構(gòu)造此實(shí)例。

Verify類不支持重復(fù)初始化,當(dāng)業(yè)務(wù)方需要使用新密鑰驗(yàn)簽時(shí),需要重新創(chuàng)建新Verify對象并調(diào)用init初始化。

業(yè)務(wù)方使用時(shí),在createVerify時(shí)確定驗(yàn)簽的模式,調(diào)用init接口設(shè)置密鑰。

當(dāng)簽名數(shù)據(jù)較短時(shí),可在init初始化后直接調(diào)用verify接口傳入簽名數(shù)據(jù)和原文進(jìn)行驗(yàn)簽。

當(dāng)簽名數(shù)據(jù)較長時(shí),可通過update接口分段傳入簽名數(shù)據(jù),最后調(diào)用verify接口對整體簽名數(shù)據(jù)進(jìn)行驗(yàn)簽。

當(dāng)使用update分段傳入簽名數(shù)據(jù)時(shí),verify接口的簽名數(shù)據(jù)支持傳null,業(yè)務(wù)方可在循環(huán)中調(diào)用update接口,循環(huán)結(jié)束后調(diào)用verify傳入原文進(jìn)行驗(yàn)簽。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

驗(yàn)簽指定的算法名稱。

init

init(pubKey : PubKey, callback : AsyncCallback<void>) : void

傳入公鑰初始化Verify對象,Callback形式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

pubKey

PubKey

公鑰對象,用于Verify的初始化

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

init

init(pubKey : PubKey) : Promise<void>

傳入公鑰初始化Verify對象,Promise形式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

pubKey

PubKey

公鑰對象,用于Verify的初始化

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

update

update(data : DataBlob, callback : AsyncCallback<void>) : void

追加待驗(yàn)簽數(shù)據(jù),callback方式

說明

Verify多次調(diào)用update的代碼示例詳見開發(fā)指導(dǎo)“使用簽名驗(yàn)簽操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

callback

AsyncCallback<void>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

update

update(data : DataBlob) : Promise<void>;

追加待驗(yàn)簽數(shù)據(jù),promise方式

說明

Verify多次調(diào)用update的代碼示例詳見開發(fā)指導(dǎo)“使用簽名驗(yàn)簽操作”。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

返回值:

類型

說明

Promise<void>

Promise對象

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

verify

verify(data : DataBlob, signatureData : DataBlob, callback : AsyncCallback<boolean>) : void

對數(shù)據(jù)進(jìn)行驗(yàn)簽,返回驗(yàn)簽結(jié)果,callback方式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

signatureData

DataBlob

簽名數(shù)據(jù)

callback

AsyncCallback<boolean>

回調(diào)函數(shù)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

verify

verify(data : DataBlob, signatureData : DataBlob) : Promise<boolean>

對數(shù)據(jù)進(jìn)行驗(yàn)簽,返回驗(yàn)簽結(jié)果,promise方式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

data

DataBlob

傳入的消息

signatureData

DataBlob

簽名數(shù)據(jù)

返回值:

類型

說明

Promise<boolean>

異步返回值,代表驗(yàn)簽是否通過

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

callback示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let globalKeyPair; // globalKeyPair為使用非對稱密鑰生成器生成的非對稱密鑰對象,此處省略生成過程
  3. let input1 = null;
  4. let input2 = null;
  5. let signMessageBlob = null; // 簽名后的數(shù)據(jù),此處省略
  6. let verifyer = cryptoFramework.createVerify("RSA1024|PKCS1|SHA25");
  7. verifyer.init(globalKeyPair.pubKey, function (err, data) {
  8. verifyer.update(input1, function(err, data) {
  9. verifyer.verify(input2, signMessageBlob, function(err, data) {
  10. console.info("verify result is " + data);
  11. })
  12. });
  13. })

promise示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let globalKeyPair; // globalKeyPair為使用非對稱密鑰生成器生成的非對稱密鑰對象,此處省略生成過程
  3. let verifyer = cryptoFramework.createVerify("RSA1024|PKCS1|SHA256");
  4. let verifyInitPromise = verifyer.init(globalKeyPair.pubKey);
  5. let input1 = null;
  6. let input2 = null;
  7. let signMessageBlob = null; // 簽名后的數(shù)據(jù),此處省略
  8. verifyInitPromise.then(() => {
  9. return verifyer.update(input1);
  10. }).then(() => {
  11. return verifyer.verify(input2, signMessageBlob);
  12. }).then(res => {
  13. console.log("Verify result is " + res);
  14. });

cryptoFramework.createKeyAgreement

createKeyAgreement(algName : string) : KeyAgreement

KeyAgreement實(shí)例生成。

支持的規(guī)格詳見框架概述“密鑰協(xié)商規(guī)格”一節(jié)。

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

algName

string

指定密鑰協(xié)商算法:目前僅支持ECC

返回值

類型

說明

KeyAgreement

返回由輸入算法指定生成的KeyAgreement對象

示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");

KeyAgreement

KeyAgreement類,使用密鑰協(xié)商方法之前需要?jiǎng)?chuàng)建該類的實(shí)例進(jìn)行操作,通過createKeyAgreement(algName : string) : KeyAgreement方法構(gòu)造此實(shí)例。

屬性

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

名稱

類型

可讀

可寫

說明

algName

string

密鑰協(xié)商指定的算法名稱。

generateSecret

generateSecret(priKey : PriKey, pubKey : PubKey, callback : AsyncCallback<DataBlob>) : void

基于傳入的私鑰與公鑰進(jìn)行密鑰協(xié)商,返回共享秘密,Callback形式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

priKey

PriKey

設(shè)置密鑰協(xié)商的私鑰輸入

pubKey

PubKey

設(shè)置密鑰協(xié)商的公鑰輸入

callback

AsyncCallback<DataBlob>

異步接受共享秘密的回調(diào)

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

generateSecret

generateSecret(priKey : PriKey, pubKey : PubKey) : Promise<DataBlob>

基于傳入的私鑰與公鑰進(jìn)行密鑰協(xié)商,返回共享秘密,Promise形式

系統(tǒng)能力: SystemCapability.Security.CryptoFramework

參數(shù):

參數(shù)名

類型

必填

說明

priKey

PriKey

設(shè)置密鑰協(xié)商的私鑰輸入

pubKey

PubKey

設(shè)置密鑰協(xié)商的公鑰輸入

返回值:

類型

說明

Promise<DataBlob>

共享秘密

錯(cuò)誤碼:

錯(cuò)誤碼ID

錯(cuò)誤信息

17620001

memory error.

17620002

runtime error.

17630001

crypto operation error.

callback示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let globalKeyPair; // globalKeyPair為使用非對稱密鑰生成器生成的非對稱密鑰對象,此處省略生成過程
  3. let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
  4. keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey, function (err, secret) {
  5. if (err) {
  6. console.error("keyAgreement error.");
  7. return;
  8. }
  9. console.info("keyAgreement output is " + secret.data);
  10. });

promise示例:

  1. import cryptoFramework from "@ohos.security.cryptoFramework"
  2. let globalKeyPair; // globalKeyPair為使用非對稱密鑰生成器生成的非對稱密鑰對象,此處省略生成過程
  3. let keyAgreement = cryptoFramework.createKeyAgreement("ECC256");
  4. let keyAgreementPromise = keyAgreement.generateSecret(globalKeyPair.priKey, globalKeyPair.pubKey);
  5. keyAgreementPromise.then((secret) => {
  6. console.info("keyAgreement output is " + secret.data);
  7. }).catch((error) => {
  8. console.error("keyAgreement error.");
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號