【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解

【HarmonyOS 5】鴻蒙TEE(可信執行環境)詳解

一、TEE是什么?

1、TEE的定義:
可信執行環境(Trusted Execution Environment),簡稱TEE,是存在于智能手機、平板或任意移動設備主處理器中的一個安全區域,確保各種敏感數據在一個可信環境中被存儲、處理和受到保護。

2、TEE的作用
簡單來說,TEE構建一個隔離的安全執行環境。該環境具備獨立的計算和存儲能力,能確保在其中運行的程序和數據受到嚴格保護,即使主系統被GJ或篡改,TEE內的內容也能保持安全。

TEE為授權安全軟件,也稱為“可信應用”提供一個安全的執行環境,通過實施保護、保密性、完整性和數據訪問權限確保端到端的安全。

3、TEE的能力歸屬:
TEE在鴻蒙系統中以Kit的形式,提供給App使用。在Device Security Kit中包括應用設備狀態檢測、安全檢測、可信應用服務、業務風險檢測能力。

4、硬件級安全保障
依賴芯片級的安全能力(如ARM的TrustZone、Intel的SGX等技術),通過硬件隔離機制確保TEE的安全性,降低軟件層面被GJ的風險。
5、 與鴻蒙系統深度集成
適配鴻蒙的微內核架構和分布式特性,可在多設備(如手機、智能手表、智能家居設備)之間實現安全能力的協同,例如在分布式場景下統一管理用戶身份和數據安全。
6、動態信任鏈機制
從系統啟動階段就建立可信根,通過信任鏈傳遞確保TEE環境的完整性,防止啟動過程中被惡意篡改。

7、 移動支付與金融安全
在進行掃碼支付、銀行卡信息輸入等操作時,鴻蒙TEE可保護支付密鑰和交易數據,防止被惡意軟件竊取,類似傳統手機中TEE用于保護銀聯閃付等功能。
8、生物特征識別
存儲和處理指紋、人臉等生物特征數據,確保解鎖、支付等場景中生物信息的安全,例如手機解鎖時,生物特征的比對過程在TEE中完成。
9、 數字版權管理(DRM)
保護視頻、音樂等數字內容的版權,確保只有授權設備和用戶才能播放加密的媒體文件,防止盜版內容傳播。
10、 企業級安全應用
為企業提供安全的身份認證、數據加密傳輸等功能,例如在鴻蒙平板或筆記本中,TEE可保護企業機密文件和遠程辦公的安全連接。

二、如何使用TEE?

目前提供可信應用服務,例如:安全攝像頭場景,安全地址位置場景,安全圖像壓縮和裁剪場景。

【從API12開始,開發者需要開通可信應用服務才可以正常使用接口,否則調用接口會拋出異常,已上架的應用需要開通服務后重新上架。】

1、首先我們需要給App開通可信應用服務:
默認在AGC平臺是沒有該設置入門。需要App通過白名單審核,審核通過后方可開通可信應用服務。
說明。
開通“可信應用服務”需要先申請進入允許清單,請將Developer ID、公司名稱、應用名稱、申請使用的服務和使用該服務的場景,發送到agconnect@huawei.com。AGC運營將審核相關材料,通過后將為您配置受限開放服務使用的名單,審核周期為1-3個工作日,請耐心等待。

可信應用服務:點擊“可信應用服務”右側的按鈕,接入“可信應用服務”:
在這里插入圖片描述
2、可信服務調用流程:
我們以為安全相機為例講解:
在這里插入圖片描述

import { camera } from '@kit.CameraKit';
import { image } from '@kit.ImageKit';@Entry
@Component
struct SecureCameraDemo {private cameraManager: camera.CameraManager = camera.getCameraManager();private secureCamera: camera.CameraDevice | null = null;private cameraInput: camera.CameraInput | null = null;private previewOutput: camera.PreviewOutput | null = null;private secureOutput: camera.PreviewOutput | null = null;private secureSession: camera.SecureSession | null = null;private imageReceiver: image.ImageReceiver | null = null;private previewProfile: camera.Profile | null = null;private secureCameraSerialNumber: bigint | null = null;private previewSurfaceId: string = '';aboutToAppear() {this.initSecureCamera();}aboutToDisappear() {this.releaseResources();}// 初始化安全相機async initSecureCamera() {try {// 選擇支持安全相機的設備await this.selectSecureCameraDevice();if (!this.secureCamera) {console.error('未找到支持安全相機的設備');return;}// 查詢相機設備在安全模式下支持的輸出能力await this.getSecureCameraOutputCapability();if (!this.previewProfile) {console.error('未獲取到支持的預覽配置');return;}// 創建設備輸入輸出await this.createInputAndOutputs();// 打開安全設備await this.openSecureCamera();// 創建安全相機會話,配流啟流await this.openSecureSession();// 注冊安全數據流回調this.registerSecureDataCallback();} catch (error) {console.error(`初始化安全相機失敗: ${JSON.stringify(error)}`);}}// 選擇支持安全相機的設備async selectSecureCameraDevice() {const cameraArray = await this.cameraManager.getSupportedCameras();for (const cameraDevice of cameraArray) {if (await this.isSecureCamera(cameraDevice)) {this.secureCamera = cameraDevice;console.info('找到支持安全相機的設備');break;}}}// 判斷設備是否支持安全相機async isSecureCamera(cameraDevice: camera.CameraDevice): Promise<boolean> {const sceneModes = await this.cameraManager.getSupportedSceneModes(cameraDevice);const secureMode = sceneModes.find(mode => mode === camera.SceneMode.SECURE_PHOTO);return secureMode !== undefined;}// 查詢相機設備在安全模式下支持的輸出能力async getSecureCameraOutputCapability() {if (!this.secureCamera) return;const outputCap = await this.cameraManager.getSupportedOutputCapability(this.secureCamera, camera.SceneMode.SECURE_PHOTO);// 選擇推薦的預覽分辨率 640*480this.previewProfile = outputCap.previewProfiles.find(profile => profile.size.width === 640 && profile.size.height === 480);// 如果沒有找到 640*480 的分辨率,選擇第一個可用的if (!this.previewProfile && outputCap.previewProfiles.length > 0) {this.previewProfile = outputCap.previewProfiles[0];}}// 創建設備輸入輸出async createInputAndOutputs() {if (!this.secureCamera || !this.previewProfile) return;// 創建輸入流this.cameraInput = await this.cameraManager.createCameraInput(this.secureCamera);// 創建普通預覽輸出流this.previewSurfaceId = this.createPreviewSurface();this.previewOutput = await this.cameraManager.createPreviewOutput(this.previewProfile, this.previewSurfaceId);// 創建安全數據輸出流this.imageReceiver = image.createImageReceiver({ width: this.previewProfile.size.width, height: this.previewProfile.size.height },image.ImageFormat.JPEG, 8);const secureSurfaceId = await this.imageReceiver.getReceivingSurfaceId();this.secureOutput = await this.cameraManager.createPreviewOutput(this.previewProfile, secureSurfaceId);}// 創建預覽SurfacecreatePreviewSurface(): string {// 這里需要實現創建預覽Surface的邏輯// 實際開發中可能需要使用鴻蒙的UI組件來創建預覽Surfacereturn 'previewSurfaceId';}// 打開安全設備async openSecureCamera() {if (!this.cameraInput) return;// 打開安全相機并獲取序列號this.secureCameraSerialNumber = await this.cameraInput.open(true);console.info(`安全相機已打開,序列號: ${this.secureCameraSerialNumber}`);// 使用序列號創建證明密鑰和初始化證明會話// 注意:這部分需要調用DeviceSecurity Kit的API,此處僅為示例this.initializeAttestationSession(this.secureCameraSerialNumber);}// 初始化證明會話(調用DeviceSecurity Kit)initializeAttestationSession(serialNumber: bigint) {// 實際開發中需要調用DeviceSecurity Kit的API// 以下為示例代碼,需要根據實際API進行調整console.info(`使用安全相機序列號 ${serialNumber} 初始化證明會話`);// const deviceSecurityKit = ...; // 獲取DeviceSecurity Kit實例// deviceSecurityKit.createAttestationKey(serialNumber);// deviceSecurityKit.initializeAttestationSession(...);}// 創建安全相機會話,配流啟流async openSecureSession() {if (!this.cameraManager || !this.cameraInput || !this.previewOutput || !this.secureOutput) return;try {this.secureSession = await this.cameraManager.createSession(camera.SceneMode.SECURE_PHOTO);if (!this.secureSession) {console.error('創建安全會話失敗');return;}await this.secureSession.beginConfig();await this.secureSession.addInput(this.cameraInput);await this.secureSession.addOutput(this.previewOutput);await this.secureSession.addOutput(this.secureOutput);await this.secureSession.addSecureOutput(this.secureOutput); // 標記為安全輸出await this.secureSession.commitConfig();await this.secureSession.start();console.info('安全會話已啟動');} catch (error) {console.error(`打開安全會話失敗: ${JSON.stringify(error)}`);}}// 注冊安全數據流回調registerSecureDataCallback() {if (!this.imageReceiver) return;this.imageReceiver.on('imageArrival', async () => {try {const img = await this.imageReceiver!.readNextImage();const component = await img.getComponent(image.ComponentType.JPEG);const buffer = component.byteBuffer;// 將安全數據發送到服務器進行驗證this.sendSecureDataToServer(buffer);// 處理完后釋放圖像資源img.release();} catch (error) {console.error(`處理安全數據失敗: ${JSON.stringify(error)}`);}});}// 將安全數據發送到服務器進行驗證sendSecureDataToServer(buffer: ArrayBuffer) {// 實際開發中需要實現將安全數據發送到服務器的邏輯console.info(`發送安全數據到服務器,數據大小: ${buffer.byteLength} 字節`);// 示例:使用fetch API發送數據/*fetch('https://your-server.com/verify-secure-data', {method: 'POST',body: buffer,headers: {'Content-Type': 'application/octet-stream','Secure-Camera-Serial': this.secureCameraSerialNumber?.toString() || ''}}).then(response => response.json()).then(result => {console.info('服務器驗證結果:', result);}).catch(error => {console.error('發送安全數據失敗:', error);});*/}// 釋放資源async releaseResources() {try {// 停止會話if (this.secureSession) {await this.secureSession.stop();await this.secureSession.release();this.secureSession = null;}// 釋放輸出if (this.previewOutput) {await this.previewOutput.release();this.previewOutput = null;}if (this.secureOutput) {await this.secureOutput.release();this.secureOutput = null;}// 釋放輸入if (this.cameraInput) {await this.cameraInput.release();this.cameraInput = null;}// 釋放圖像接收器if (this.imageReceiver) {this.imageReceiver.release();this.imageReceiver = null;}console.info('安全相機資源已釋放');} catch (error) {console.error(`釋放資源失敗: ${JSON.stringify(error)}`);}}build() {Column() {Text('安全相機演示').fontSize(20).fontWeight(FontWeight.Bold).margin({ top: 20, bottom: 20 })// 這里可以添加預覽界面組件// 實際開發中需要根據鴻蒙的UI組件來實現預覽顯示Text('安全相機預覽區域').width('100%').height(300).backgroundColor('#CCCCCC').textAlign(TextAlign.Center).margin({ bottom: 20 })Button('釋放相機').onClick(() => {this.releaseResources();})}.width('100%').height('100%').padding(15)}
}    

三、環境隔離的使用方法

綜上所述,基于TEE的環境。我們將敏感信息加密后,放在TEE環境中,就可以做到最高的安全保護。
對用戶的敏感數據(如生物特征信息、支付密碼、加密密鑰等)進行加密存儲和處理,防止數據被未授權的程序或進程訪問。

1. 使用DeviceSecurity Kit訪問TEE

HarmonyOS提供了DeviceSecurity Kit來訪問TEE功能,包括創建安全密鑰、執行安全操作和存儲敏感數據。主要步驟如下:

步驟1:導入依賴
import { deviceSecurity } from '@ohos.security.deviceSecurity';
步驟2:獲取TEE會話
async function getTEESession() {try {// 獲取TEE服務實例const teeService = await deviceSecurity.getTrustedExecutionEnvironmentService();// 創建安全會話(根據實際需求選擇合適的安全級別)const session = await teeService.createSession({authType: deviceSecurity.AuthType.ALL, // 認證類型authLevel: deviceSecurity.AuthLevel.SYSTEM, // 認證級別userId: 0 // 用戶ID});return session;} catch (error) {console.error(`獲取TEE會話失敗: ${JSON.stringify(error)}`);return null;}
}

2. 在TEE中緩存數據

在TEE環境中緩存數據有兩種主要方式:安全存儲安全內存

方式1:安全存儲(持久化緩存)

使用TrustedStorage接口將數據加密存儲在TEE中:

async function cacheDataSecurely(session: deviceSecurity.TrustedExecutionEnvironmentSession, key: string, data: string) {try {// 將數據轉換為ArrayBufferconst dataBuffer = new TextEncoder().encode(data);// 創建安全存儲對象const trustedStorage = await session.getTrustedStorage();// 存儲數據(自動加密)await trustedStorage.save(key, dataBuffer);console.info(`數據已安全存儲,鍵: ${key}`);} catch (error) {console.error(`安全存儲失敗: ${JSON.stringify(error)}`);}
}
方式2:安全內存(臨時緩存)

使用TrustedMemory接口在TEE的安全內存中臨時緩存數據:

async function cacheDataInSecureMemory(session: deviceSecurity.TrustedExecutionEnvironmentSession, data: string) {try {// 將數據轉換為ArrayBufferconst dataBuffer = new TextEncoder().encode(data);// 創建安全內存區域const trustedMemory = await session.allocateTrustedMemory(dataBuffer.byteLength);// 寫入數據到安全內存await trustedMemory.write(dataBuffer);console.info('數據已緩存到安全內存');return trustedMemory;} catch (error) {console.error(`安全內存緩存失敗: ${JSON.stringify(error)}`);return null;}
}

3. 從TEE中讀取緩存數據

根據存儲方式的不同,讀取數據的方法也不同:

讀取安全存儲數據
async function readSecurelyStoredData(session: deviceSecurity.TrustedExecutionEnvironmentSession, key: string) {try {const trustedStorage = await session.getTrustedStorage();const dataBuffer = await trustedStorage.read(key);// 將ArrayBuffer轉換為字符串const data = new TextDecoder().decode(dataBuffer);return data;} catch (error) {console.error(`讀取安全存儲數據失敗: ${JSON.stringify(error)}`);return null;}
}
讀取安全內存數據
async function readDataFromSecureMemory(trustedMemory: deviceSecurity.TrustedMemory) {try {const dataBuffer = await trustedMemory.read();const data = new TextDecoder().decode(dataBuffer);return data;} catch (error) {console.error(`讀取安全內存數據失敗: ${JSON.stringify(error)}`);return null;}
}

4. 釋放資源

使用完畢后,需要釋放TEE資源以確保安全性:

async function releaseTEEResources(session: deviceSecurity.TrustedExecutionEnvironmentSession, trustedMemory?: deviceSecurity.TrustedMemory) {try {// 釋放安全內存(如果有)if (trustedMemory) {await trustedMemory.release();}// 關閉會話await session.close();console.info('TEE資源已釋放');} catch (error) {console.error(`釋放TEE資源失敗: ${JSON.stringify(error)}`);}
}

完整示例

下面是一個完整的示例,演示如何在TEE中緩存和讀取數據:

import { deviceSecurity } from '@ohos.security.deviceSecurity';async function demoTEECaching() {// 1. 獲取TEE會話const session = await getTEESession();if (!session) return;try {// 2. 緩存數據到安全存儲await cacheDataSecurely(session, 'sensitiveKey', '這是敏感數據');// 3. 從安全存儲讀取數據const storedData = await readSecurelyStoredData(session, 'sensitiveKey');console.info(`從安全存儲讀取的數據: ${storedData}`);// 4. 緩存數據到安全內存const secureMemory = await cacheDataInSecureMemory(session, '臨時敏感數據');// 5. 從安全內存讀取數據if (secureMemory) {const memoryData = await readDataFromSecureMemory(secureMemory);console.info(`從安全內存讀取的數據: ${memoryData}`);}} catch (error) {console.error(`TEE數據緩存演示失敗: ${JSON.stringify(error)}`);} finally {// 6. 釋放資源await releaseTEEResources(session);}
}

注意事項

  1. 權限要求:使用TEE功能需要在config.json中聲明相應權限:

    {"requestPermissions": [{"name": "ohos.permission.USE_TRUSTED_ENVIRONMENT","reason": "需要訪問TEE環境"}]
    }
    
  2. 數據大小限制:TEE的安全內存通常有限,不要存儲過大的數據。

  3. 生命周期管理:確保在不需要時及時釋放TEE資源,避免內存泄漏。

  4. 錯誤處理:TEE操作可能因硬件限制或安全策略失敗,需要完善的錯誤處理。

  5. 兼容性:不同設備的TEE實現可能存在差異,建議進行充分測試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89212.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89212.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89212.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

算法: 冒泡排序

冒泡排序是一種簡單的排序算法&#xff0c;通過相鄰元素的比較和交換&#xff0c;使較大的元素逐漸"浮"到數組末尾。 時間復雜度:最佳 O(n) | 平均 O(n) | 最差 O(n) 空間復雜度:O(1) 穩定性:穩定 應用場景/前提條件 適用于小規模數據對幾乎已排序的數據效率較高…

基于SpringBoot的家電銷售展示平臺

源碼編號&#xff1a;S567 源碼名稱&#xff1a;基于SpringBoot的家電銷售展示平臺 用戶類型&#xff1a;雙角色&#xff0c;用戶、管理員 數據庫表數量&#xff1a;14 張表 主要技術&#xff1a;Java、Vue、ElementUl 、SpringBoot、Maven 運行環境&#xff1a;Windows/M…

java+vue+SpringBoo智慧旅游系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

Docker 入門教程(三):鏡像操作命令

文章目錄 &#x1f433; Docker 入門教程&#xff08;三&#xff09;&#xff1a;鏡像操作命令獲取鏡像&#xff1a;docker pull查看鏡像&#xff1a;docker images刪除鏡像&#xff1a;docker rmi搜索鏡像&#xff1a;docker search鏡像打標簽&#xff1a;docker tag鏡像詳情與…

如何修改discuz文章標題字數限制 修改成255

在 Discuz! X3.5 中&#xff0c;文章&#xff08;主題&#xff09;標題字數的限制可以通過修改數據庫結構以及后臺配置來實現&#xff0c;以下是完整的修改方法&#xff0c;將標題長度限制改為 255 個字符&#xff1a; ? 一、修改數據庫字段長度 Discuz 默認標題字段是 subje…

基于BP神經網絡的26個英文字母識別

本課題旨在設計并實現一個基于BP&#xff08;反向傳播&#xff09;神經網絡的英文字母識別系統&#xff0c;實現對手寫或打印的26個英文字母&#xff08;A-Z&#xff09;的自動分類識別。項目首先對字母圖像進行預處理&#xff08;如灰度化、歸一化、二值化和特征提取&#xff…

系統架構設計師論文分享-論云原生技術的應用

我的軟考歷程 摘要 2023年2月&#xff0c;我所在的公司做了開發紗線MES系統的決定&#xff0c;該系統為國內紗線工廠提供SAAS服務&#xff0c;旨在提高紗線工廠的智能化和數字化水平。我在該項目中被任命為系統架構設計師&#xff0c;全面掌管該項目的架構設計工作。該項目涉…

重置 MySQL root 密碼

引言 在linux可能存在安裝mysql安裝失敗&#xff0c;一直不出現默認密碼 /usr/local/mysql/mysql-8.0.26/bin/mysqld --defaults-file/etc/my.cnf --usermysql --basedir/usr/local/mysql/mysql-8.0.26 --datadir/usr/local/mysql/mysql-8.0.26/data --lower-case-table-name…

面試八股---HTML

面試八股 1、HTML 1.1 src和href的區別 src 用于替換當前元素&#xff0c;href 用于在當前文檔和引用資源之間確立聯系。 核心區別在于 href 關聯的資源&#xff08;主要是 CSS&#xff09;是用于描述頁面外觀的&#xff0c;瀏覽器可以先生成內容再應用樣式&#xff0c;因此…

氣候智能體:AI如何重構人類應對氣候危機的決策體系?

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 《氣候智能體&#xff1a;AI如何重構人類應對氣候危機的決策體系&#xff1f;》 展開全景式論述。文章結合2025年最新技術突破與…

UITableView的位置向下偏移, contentInsetAdjustmentBehavior使用詳情

一.contentInsetAdjustmentBehavior 作用: 在iOS 11及以后&#xff0c;蘋果引入了安全區域&#xff08;Safe Area&#xff09;的概念,當UITableView的frame超出了安全區域,系統會自定調整SafeAreaInsets的值,它可以自動調整內容的內邊距&#xff0c;使得內容不會被導航欄遮擋。…

騰訊云RayData全新推出“行業解決方案模板”,一鍵快捷制作3D數據可視化作品

點擊藍字? 關注我們 本文共計958字 預計閱讀時長3分鐘 騰訊云RayData Plus是一款專注于高視效的3D數據可視化的實時渲染工具。 功能全面&#xff1a;提供了三維、二維、動畫、數據、交互邏輯等各類能力&#xff1b; 零代碼制作&#xff1a;靈活的節點式創作&#xff0c;即便沒…

深度解析基于貝葉斯的垃圾郵件分類

貝葉斯垃圾郵件分類的核心邏輯是基于貝葉斯定理&#xff0c;利用郵件中的特征&#xff08;通常是單詞&#xff09;來計算該郵件屬于“垃圾郵件”或“非垃圾郵件”的概率&#xff0c;并根據概率大小進行分類。它是一種樸素貝葉斯分類器&#xff0c;因其假設特征&#xff08;單詞…

WPF 3D 開發全攻略:實現3D模型創建、旋轉、平移、縮放

&#x1f3ae; WPF 3D 入門實戰&#xff1a;從零打造一個可交互的立方體模型 標題&#xff1a; &#x1f680;《WPF 3D 開發全攻略&#xff1a;實現旋轉、平移、縮放與法線顯示》 &#x1f4a1; 引言 在現代圖形應用中&#xff0c;3D 可視化已經成為不可或缺的一部分。WPF 提供…

Ruby 安裝使用教程

一、Ruby 簡介 Ruby 是一種簡單快捷的面向對象腳本語言&#xff0c;以優雅、簡潔、易讀著稱。它常被用于 Web 開發&#xff08;如 Ruby on Rails 框架&#xff09;、自動化腳本、DevOps、命令行工具等領域。 二、Ruby 安裝教程 2.1 支持平臺 Ruby 支持跨平臺運行&#xff0c…

python | numpy小記(五):理解 NumPy 中的 `np.arccos`:反余弦函數

python | numpy小記&#xff08;五&#xff09;&#xff1a;理解 NumPy 中的 np.arccos&#xff1a;反余弦函數 一、函數簽名與核心參數二、數學定義與取值范圍三、基礎使用示例四、與 Python 內建 math.acos 的對比五、常見問題與注意事項六、典型應用場景1. 三維向量夾角計算…

華為云Flexus+DeepSeek征文 | 華為云ModelArts與Reor的完美結合:創建高效本地AI筆記環境

華為云FlexusDeepSeek征文 | 華為云ModelArts與Reor的完美結合&#xff1a;創建高效本地AI筆記環境 引言一、ModelArts Studio平臺介紹華為云ModelArts Studio簡介ModelArts Studio主要特點 二、Reor介紹Reor簡介Reor主要特點 三、安裝Reor工具下載Reor軟件安裝Reor工具 四、開…

【啟發式算法】Dynamic A*(D*)算法詳細介紹(Python)

&#x1f4e2;本篇文章是博主人工智能&#xff08;AI&#xff09;領域學習時&#xff0c;用于個人學習、研究或者欣賞使用&#xff0c;并基于博主對相關等領域的一些理解而記錄的學習摘錄和筆記&#xff0c;若有不當和侵權之處&#xff0c;指出后將會立即改正&#xff0c;還望諒…

報告怎么寫

替代方案&#xff08;按場景選擇&#xff09; 崗前準備階段 ? "熟悉業務流程/系統操作" ? "掌握XX工具/平臺的核心功能" ? "完成上崗前技術對接" 知識轉化場景 ? "梳理產品知識體系" ? "轉化技術文檔為實操方案" ? &…

大模型——怎么讓 AI 寫出好看有設計感的網頁

大模型——怎么讓 AI 寫出好看有設計感的網頁 你讓 AI 給你寫的網頁大概都是這樣的: 或者這樣: 好點的時候能這樣: 但都不夠高級,尤其是那個像引用一樣的邊框,太 AI 了。 今天教大家一個小技巧,寫出下面這樣的網頁: 或者這樣的