当前位置: 首页 > news >正文

网站图片有什么要求南宁软件优化网站

网站图片有什么要求,南宁软件优化网站,天津建设银行公积金缴费网站,小小影院免费高清电视剧前言 在iOS开发中Keychain 是一个非常安全的存储系统#xff0c;用于保存敏感信息#xff0c;如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同#xff0c;Keychain 提供了更高的安全性#xff0c;因为它对数据进行了加密#xff0c;并且只有经过授权的应用程序才…前言 在iOS开发中Keychain 是一个非常安全的存储系统用于保存敏感信息如密码、证书、密钥等。与 NSUserDefaults 或文件系统不同Keychain 提供了更高的安全性因为它对数据进行了加密并且只有经过授权的应用程序才能访问存储的数据。那么在鸿蒙里面对应的是什么呢 1、关键资产(ohos.security.asset) 在鸿蒙里面也有类似的东西叫做关键资产(ohos.security.asset),关键资产存储服务提供了用户短敏感数据的安全存储及管理能力。其中短敏感数据可以是密码类账号/密码、Token类应用凭据、其他关键明文如银行卡号等长度较短的用户敏感数据。 从API version 11 开始支持 使用关键资产需要导入模块AssetStoreKit import { asset } from kit.AssetStoreKit;2、asset常用操作 version 11 开始支持异步方法如下 asset.addadd(attributes: AssetMap): Promise新增一条关键资产使用Promise方式异步返回结果。 asset.removeremoveSync(query: AssetMap): void删除符合条件的一条或多条关键资产使用异步方式。 asset.updateupdate(query: AssetMap, attributesToUpdate: AssetMap): Promise更新符合条件的一条关键资产使用Promise方式异步返回结果。 asset.queryquery(query: AssetMap): PromiseArray查询一条或多条符合条件的关键资产。若查询需要用户认证的关键资产则需要在本函数前调用asset.preQuery在本函数后调用asset.postQuery使用Promise回调异步返回结果。 asset.preQuerypreQuery(query: AssetMap): Promise查询的预处理用于需要用户认证的关键资产。在用户认证成功后应当随后调用asset.query、asset.postQuery。使用Promise方式异步返回结果。 asset.postQuerypostQuery(handle: AssetMap): Promise查询的后置处理用于需要用户认证的关键资产。需与asset.preQuery函数成对出现。使用Promise方式异步返回结果。 version 12 开始支持同步方法如下 asset.addSync新增一条关键资产使用Promise方式同步步返回结果。 asset.removeSyncremoveSync(query: AssetMap): void删除符合条件的一条或多条关键资产使用同步方式。 asset.addSync新增一条关键资产使用Promise方式同步步返回结果。 asset.removeSyncremoveSync(query: AssetMap): void删除符合条件的一条或多条关键资产使用同步方式。 asset.updateSyncupdateSync(query: AssetMap, attributesToUpdate: AssetMap): void更新符合条件的一条关键资产使用同步方式返回结果。 asset.querySyncquerySync(query: AssetMap): Array查询一条或多条符合条件的关键资产。若查询需要用户认证的关键资产则需要在本函数前调用asset.preQuerySync在本函数后调用asset.postQuerySync使用同步方式返回结果。 asset.preQuerySyncpreQuerySync(query: AssetMap): Uint8Array查询的预处理用于需要用户认证的关键资产。在用户认证成功后应当随后调用asset.querySync、asset.postQuerySync。使用同步方式返回结果。 asset.postQuerySyncpostQuerySync(handle: AssetMap): void查询的后置处理用于需要用户认证的关键资产。需与asset.preQuerySync函数成对出现。使用同步方式返回结果。 关键资产需要使用到的系统能力 SystemCapability.Security.Asset 3、asset的封装使用 在iOS中使用Keychain 比较常见的功能是存储一个值作为设备唯一标识那么asset也以此作为示例封装一个刚好前阵子项目里面也使用了。我也封装了一个工具类hmDeviceTools。 3.1 导入需要的头文件 import { util } from kit.ArkTS import { asset } from kit.AssetStoreKit; import { BusinessError } from kit.BasicServicesKit;3.2 封装工具类 hmDeviceTools类内容 export class hmDeviceTools {private static deviceIdCacheKey testdevice_id_cache_key //testkeyprivate static deviceId /*** * 判断字符串是否为空* param property 被检测的字符串* return Boolean*/static isEmpty(property?: string | null): Boolean {if (property || property null || property undefined || property undefined ||property.length 0) {return true}return false}/*** 获取设备id*/static getDeviceId() {let deviceId hmDeviceTools.deviceId//如果内存缓存为空则从AssetStore中读取if (hmDeviceTools.isEmpty(deviceId)) {deviceId getAssetMap(hmDeviceTools.deviceIdCacheKey)}//如果AssetStore中未读取到则随机生成32位随机码然后缓存到AssetStore中if (hmDeviceTools.isEmpty(deviceId)) {deviceId util.generateRandomUUID(true).replace(new RegExp(-, gm), )deviceId deviceId.slice(0,Math.min(10,deviceId.length))//可以确保不会超出字符串的长度。setAssetMap(hmDeviceTools.deviceIdCacheKey, deviceId)}hmDeviceTools.deviceId deviceIdreturn deviceId} }getDeviceId函数里面我是截取的10位大家可以工具自己的具体业务来自行截取或者使用使用generateRandomUUID返回的32位。 3.3 addSync 设置数据 既然有异步和同步可选我当然是使用addSync同步来写了后面的方法都是使用同步来实现。 /*** 设置数据* param key 要查找的索引* param value 需要存的值*/ function setAssetMap(key: string, value: string) {let attr: asset.AssetMap new Map();let result: Booleanif (canIUse(SystemCapability.Security.Asset)) {// 关键资产别名每条关键资产的唯一索引。// 类型为Uint8Array长度为1-256字节。attr.set(asset.Tag.ALIAS, stringToArray(key));// 关键资产明文。// 类型为Uint8Array长度为1-1024字节attr.set(asset.Tag.SECRET, stringToArray(value));// 关键资产同步类型THIS_DEVICE只在本设备进行同步如仅在本设备还原的备份场景。attr.set(asset.Tag.SYNC_TYPE, asset.SyncType.THIS_DEVICE);//枚举新增关键资产时的冲突如别名相同处理策略。OVERWRITE》抛出异常由业务进行后续处理。// attr.set(asset.Tag.CONFLICT_RESOLUTION,asset.ConflictResolution.THROW_ERROR)// 在应用卸载时是否需要保留关键资产。// 需要权限 ohos.permission.STORE_PERSISTENT_DATA。// 类型为bool。// attr.set(asset.Tag.IS_PERSISTENT, true);//我项目里面没有使用就先注释了后续有需要这个再打开并且要设置对应权限}if (isHasKey(key)) {result updateAssetMap(attr, attr);} else {try {asset.addSync(attr);result true} catch (error) {let err error as BusinessError;console.error(Failed to add Asset. Code is ${err.code}, message is ${err.message});result false}}}3.4 querySync 获取数据 /*** 获取数据* param key 要查找的索引* returns string 表示操作的结果*/ function getAssetMap(key: string): string {if (canIUse(SystemCapability.Security.Asset)) {let query: asset.AssetMap new Map();// 关键资产别名每条关键资产的唯一索引。// 类型为Uint8Array长度为1-256字节。query.set(asset.Tag.ALIAS, stringToArray(key));// 关键资产查询返回的结果类型。query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL);// query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ATTRIBUTES); // 此处表示仅返回关键资产属性不包含关键资产明文try {let res: Arrayasset.AssetMap asset.querySync(query);for (let i 0; i res.length; i) {// parse the attribute.if (res[i] ! null) {// parse the secret.let secret: Uint8Array res[0].get(asset.Tag.SECRET) as Uint8Array;// parse uint8array to stringlet secretStr: string arrayToString(secret);return secretStr;}}} catch (error) {let err error as BusinessError;console.error(Failed to query Asset. Code is ${err.code}, message is ${err.message});return ;}}return ; }3.4 querySync 查询key /*** 判断key是否存在* param key 要查找的索引* returns Boolean 表示添加操作的结果*/ function isHasKey(key: string): Boolean {if (canIUse(SystemCapability.Security.Asset)) {let query: asset.AssetMap new Map();// 关键资产别名每条关键资产的唯一索引。// 类型为Uint8Array长度为1-256字节。query.set(asset.Tag.ALIAS, stringToArray(key));// 关键资产查询返回的结果类型。query.set(asset.Tag.RETURN_TYPE, asset.ReturnType.ALL);const res queryAssetMap(query);if (!res || res.length 1) {return false;}return true;}return false; }3.5 querySync 查询数据 /** * 查找数据 * param key 要查找的索引 * returns Arrayasset.AssetMap 表示添加操作的结果 */ function queryAssetMap(query: asset.AssetMap): Arrayasset.AssetMap {const assetMaps: asset.AssetMap[] [];try {if (canIUse(SystemCapability.Security.Asset)) {const res: asset.AssetMap[] asset.querySync(query);return res;}return assetMaps;} catch (error) {const err error as BusinessError;console.error(Failed to query Asset. Code is ${err.code}, message is ${err.message});return assetMaps;} }3.6 updateSync 更新数据 /*** 查找数据* param key 要查找的索引* returns Arrayasset.AssetMap 表示添加操作的结果*/ function queryAssetMap(query: asset.AssetMap): Arrayasset.AssetMap {const assetMaps: asset.AssetMap[] [];try {if (canIUse(SystemCapability.Security.Asset)) {const res: asset.AssetMap[] asset.querySync(query);return res;}return assetMaps;} catch (error) {const err error as BusinessError;console.error(Failed to query Asset. Code is ${err.code}, message is ${err.message});return assetMaps;} }使用到的其他函数 function stringToArray(str: string): Uint8Array {let textEncoder new util.TextEncoder();return textEncoder.encodeInto(str); }function arrayToString(arr: Uint8Array): string {let textDecoder util.TextDecoder.create(utf-8, { fatal: false, ignoreBOM: true });let decodeToStringOptions: util.DecodeToStringOptions {stream: false}let str textDecoder.decodeToString(arr, decodeToStringOptions);return str; }4、特别说明 如果需要卸载之后获取的值不变需要设置IS_PERSISTENT属性需要申请ohos.permission.STORE_PERSISTENT_DATA权限。 完整项目的结构如下 5、参考 1、华为官网:ohos.security.asset (关键资产存储服务) 2、冉冉同学:【HarmonyOS NEXT】获取卸载APP后不变的设备ID
http://www.hkea.cn/news/14495876/

相关文章:

  • 合肥网站建设优化学习工作台
  • 网站做seo必要的结构深圳做网站seo
  • 网站域名攻击郑州官方发布最新消息
  • 网站如何开通微信支付接口昆仑万维做网站
  • 电子商务企业 网站前台建设 苏宁手机网银怎么开通
  • 重庆龙华网站建设公司网页传奇排名
  • 网站ie兼容性差邯郸学校网站建设价格
  • 仙居住房和城乡建设规划局网站手机导航下载2022新版
  • 提供邯郸企业建网站网络舆情监测员
  • 网站从建设到赚钱的流程网站蜘蛛池怎么做的
  • 西宁网站建设索王道下拉gif在线制作生成器
  • 门户网站是如何盈利的公司做网站怎么赚钱
  • 德州市经济开发区建设局网站我想网上做网站
  • 郑州网站建设喝彩科技国内优秀网站欣赏
  • 做网站流程视频广州有哪些广告公司
  • 女生化妆品网站建设规划书wordpress侧栏文本
  • 网站怎么做弹幕播放器招工在哪个平台最好
  • php网站开发薪资修车店怎么做网站
  • 门户网站建设背景苏南建设集团网站
  • 强生的网站建设原则wordpress本地建站教程
  • 辽宁城市建设职业技术学院教育网站WordPress谁在用
  • 建设个人网站可以卖产品吗网站建设工资郑州
  • 网站管理助手4.0教程小型公司怎么注册
  • 想学做网站学什么教程工程公司年会发言稿
  • 用什么网站做浏览器主页哪个网站微博做的最好
  • 免费做外贸的网站空间长沙做网站比较好的公司
  • 玉田县建设工程招标网站网站首页策划怎么做
  • 自己做网站的劣势wap视频网站建设难吗?
  • 百度自然排名网站的logo怎么做中国建筑集团有限公司天眼查
  • 购物网站大全棉鞋wordpress教程 ppt