HarmonyOS鸿蒙Next中实现数据DLP加密示例代码

HarmonyOS鸿蒙Next中实现数据DLP加密示例代码

介绍

数据防泄漏服务(Data Loss Prevention,简称为DLP),是系统提供的系统级的数据防泄漏解决方案,提供文件权限管理、加密存储、授权访问等能力,数据所有者可以基于账号认证对机密文件进行权限配置,允许拥有只读、编辑、拥有者权限,随后机密文件会通过密文存储,在支持DLP机制的设备上可以通过端云协调进行认证授权,获取对数据的访问和修改的能力。

本示例演示了如何创建、编辑一个dlp文件。

实现数据DLP加密源码地址

使用说明

  1. 进入应用会看到两个按钮,根据文字提示点击第一个按钮可创建一个test.txt文件保存到本地,保存位置可选择。
  2. 点击第二个按钮,选择刚创建的test.txt文件,会显示已选择文件的信息,点击“生成dlp文件”按钮,可生成dlp文件。
  3. 再次点击第二个按钮,选择生成的txt.dlp文件,会直接打开该文件。

图片名称

实现思路

创建test.txt文件并保存

使用@ohos.file.picker接口实现test.txt文件的创建和保存,使用@ohos.file.fs接口以同步方法打开创建的test.txt文件并写入数据。核心代码如下,源码参考

Index.ets

async saveFile () {
    let uri = ''
    try {
      let DocumentSaveOptions = new picker.DocumentSaveOptions();
      DocumentSaveOptions.newFileNames = ['test.txt'];
      let documentPicker = new picker.DocumentViewPicker();
      await documentPicker.save(DocumentSaveOptions).then((DocumentSaveResult: Array<string>) => {
        console.info(TAG, 'DocumentViewPicker.save successfully, DocumentSaveResult uri: ' + JSON.stringify(DocumentSaveResult));
        uri = DocumentSaveResult[0]
        return uri
      }).catch((err: BusinessError) => {
        console.error(TAG, 'DocumentViewPicker.save failed with err: ' + JSON.stringify(err));
        return uri
      });
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(TAG, 'DocumentViewPicker failed with err: ' + JSON.stringify(err));
      return uri
    }
    return uri
  }

  writeText (filePath: string) {
    if (!filePath) {
      return
    }
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    let str: string = "hello, world";
    let writeLen = fs.writeSync(file.fd, str);
    console.info(TAG, "write data to file succeed and size is:" + writeLen);
    fs.closeSync(file);
  }

生成dlp文件

先利用@ohos.file.picker接口选择一个文件,再使用@ohos.dlpPermission接口根据文件的fd,查询该文件是否是dlp文件。如果该文件不是dlp文件,则通过@ohos.app.ability.Want接口传入txt文件的数据,生成对应的dlp文件;如果该文件是dlp文件,则直接打开文件。

核心代码如下,源码参考

Index.ets,dlpPage.ets

// 选择一个文件
async callFilePickerSelectFile () {
    let DocumentSelectOptions = new picker.DocumentSelectOptions();
    DocumentSelectOptions.maxSelectNumber = 20;
    let documentPicker = new picker.DocumentViewPicker();
    documentPicker.select( DocumentSelectOptions ).then( ( DocumentSelectResult ) => {
      console.info( TAG , 'DocumentViewPicker.select successfully, DocumentSelectOptions : ' + JSON.stringify( DocumentSelectOptions ) );
      console.info( TAG , 'DocumentViewPicker.select successfully, DocumentSelectResult uri: ' + JSON.stringify( DocumentSelectResult ) );
      let editFlag = false;
      if ( DocumentSelectResult !== null && DocumentSelectResult !== undefined ) {
        DocumentSelectResult.forEach( ( value ) => {
          this.uri = value;
          editFlag = true;
          console.info( TAG , `select file uri: ${ this.uri }` );
        } )
      }
      if ( editFlag ) {
        this.getFilenameByUri( this.uri );
      }
    } ).catch( ( err: BusinessError ) => {
      console.error( TAG , 'DocumentViewPicker.select failed with err: ' + JSON.stringify( err ) );
    } );
  }
/**
   * 是否为dlp文件
   */
  async isDlpFileFunc ( fd: number ): Promise<boolean> {
    try {
      this.isDLPFile = await dlpPermission.isDLPFile(fd); // 是否加密DLP文件
      console.info( TAG , 'isDlpFile:' + this.isDLPFile );
      this.inSandbox = await dlpPermission.isInSandbox();
      let msg = 'isDlpFile:' + true + ';inSandbox:' + this.inSandbox;
      dlpPermission.getDLPPermissionInfo().then( ( data: dlpPermission.DLPPermissionInfo ) => {
        console.info( TAG , 'getDLPPermissionInfo, result: ' + JSON.stringify( data ) );
        promptAction.showToast( { message : msg + ' permission:' + JSON.stringify( data ) , duration : 2000 } );
      } ).catch( ( err: BusinessError ) => {
        console.info( TAG , 'getDLPPermissionInfo: ' + JSON.stringify( err ) );
      } );
    } catch(err) {
      console.error( TAG , 'isDLPFile error:' + (err as BusinessError).code + (err as BusinessError).message );
    }
    return this.isDLPFile;
  }
/**
   * 生成dlp文件
   */
  async onEncrypt() {
    console.info( TAG + 'new file and encrypt' );
    let context = getContext() as common.UIAbilityContext; // 获取当前UIAbilityContext
    let want: Want = {
      "action" : "ohos.want.action.editData" ,
      "bundleName" : "com.ohos.dlpmanager" ,
      "type" : "text/plain" ,
      "abilityName" : "MainAbility" ,
      "uri" : this.dlpUri ,
      "parameters" : {
        "displayName" : this.dlpName ,
        "fileName" : { "name" : this.dlpName } ,
        "linkFileName" : { "name" : this.dlpLinkName } ,
      }
    };
    try {
      console.info( TAG , "openDLPFile:" + JSON.stringify( want ) );
      context.startAbility( want , ( error: BusinessError ) => {
        console.error( TAG , 'want error.code =' + error.code + ',error.message =' + error.message );
      } );
    } catch(err) {
      console.error( 'openDLPFile startAbility failed' + (err as BusinessError).code + (err as BusinessError).message );
      return;
    }
  }

更多关于HarmonyOS鸿蒙Next中实现数据DLP加密示例代码的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

dlp使用有什么限制吗,这个demo一点生成dlp文件就提示 ‘当前无法操作,请稍后重试’

更多关于HarmonyOS鸿蒙Next中实现数据DLP加密示例代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,数据DLP(Data Loss Prevention)加密可以通过使用系统的安全框架来实现。以下是一个简单的示例代码,展示如何在应用中对数据进行加密存储。

import { dataProtection } from '@ohos.dataProtection';

// 初始化加密模块
let dataProtectionManager = dataProtection.getDataProtectionManager();

// 定义加密密钥
let keyAlias = 'my_secret_key';
let keyParams = {
    alias: keyAlias,
    purpose: dataProtection.Purpose.ENCRYPT_DECRYPT,
    blockMode: dataProtection.BlockMode.CBC,
    padding: dataProtection.Padding.PKCS7,
    keySize: 256
};

// 生成加密密钥
dataProtectionManager.generateKey(keyParams).then(() => {
    console.log('密钥生成成功');
}).catch((err) => {
    console.error('密钥生成失败:', err);
});

// 加密数据
let plainText = 'This is a secret message';
dataProtectionManager.encrypt(keyAlias, plainText).then((encryptedData) => {
    console.log('加密成功:', encryptedData);
}).catch((err) => {
    console.error('加密失败:', err);
});

// 解密数据
dataProtectionManager.decrypt(keyAlias, encryptedData).then((decryptedData) => {
    console.log('解密成功:', decryptedData);
}).catch((err) => {
    console.error('解密失败:', err);
});

在这个示例中,首先通过dataProtection.getDataProtectionManager()获取数据保护管理器的实例。然后定义了一个加密密钥的参数,包括别名、用途、块模式、填充方式和密钥大小。接着使用generateKey方法生成密钥,并使用encrypt方法对数据进行加密。最后,使用decrypt方法对加密后的数据进行解密。

这个示例展示了如何在HarmonyOS鸿蒙Next中使用系统提供的API实现数据的加密和解密操作。

在HarmonyOS鸿蒙Next中实现数据DLP(数据丢失防护)加密,可以通过使用系统的加密API来实现。以下是一个简单的示例代码,展示如何使用cryptoFramework模块进行数据加密:

import cryptoFramework from '@ohos.security.cryptoFramework';

async function encryptData(data: string, key: string): Promise<Uint8Array> {
    // 创建对称密钥生成器
    let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES256');
    // 生成对称密钥
    let symKey = await symKeyGenerator.convertKey(new Uint8Array(Buffer.from(key)));
    // 创建加密器
    let cipher = cryptoFramework.createCipher('AES256|ECB|PKCS7');
    // 初始化加密器
    await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
    // 加密数据
    let encryptedData = await cipher.doFinal(new Uint8Array(Buffer.from(data)));
    return encryptedData;
}

// 使用示例
let data = 'Sensitive Data';
let key = 'SecretKey123456789012345678901234';
encryptData(data, key).then(encrypted => {
    console.log('Encrypted Data:', encrypted);
});

此代码使用AES256算法对数据进行加密,确保数据在传输或存储时的安全性。

回到顶部