【C/C++】explicit_bzero

explicit_bzero

explicit_bzero 是一個為了解決 memset 在安全清除內存場景中可能被優化器移除的問題而設計的函數,廣泛用于安全編程中,比如密碼、密鑰清除等。


Introduce

頭文件

#include <string.h>

函數原型

void explicit_bzero(void *s, size_t n);

功能說明

將內存區域 s 開始的 n 個字節強制清零(寫入 0),確保不會被編譯器優化掉


為什么不能用 memset

當你寫:

char key[32];
// ... 使用 key ...
memset(key, 0, sizeof(key));

有些編譯器會發現 key 后面就不再使用,于是優化器會移除 memset 調用,導致密碼/密鑰未被真正擦除,造成信息泄露風險。

explicit_bzero 的實現避免了這一問題:

  • 使用 volatile 指針或編譯器 barrier;
  • 或直接調用外部函數(編譯器無法內聯);
  • 保證操作不可優化,滿足安全清除需求

可用平臺

平臺是否支持 explicit_bzero
? FreeBSD原生支持
? OpenBSD原生支持(首發平臺)
? glibc >= 2.25(2017)支持
? macOS 10.12+可用
🚫 Windows不支持(用 SecureZeroMemory

用法示例

#include <string.h>int main() {char secret[32] = "TopSecretPassword123!";// 使用 secret 做某些操作...// 清除 secret(防止泄露)explicit_bzero(secret, sizeof(secret));return 0;
}

📌 即使 secret 后續沒有再用,這個清除也不會被優化掉!


bzero 區別?

函數是否會被優化器移除是否已廢棄推薦使用
memset? 有風險? 不用于清除敏感數據
bzero? 有風險? 已廢棄(非標準)?
explicit_bzero? 安全? ? ?

Windows 等平臺

Windows 沒有 explicit_bzero,可以用:

#include <windows.h>
SecureZeroMemory(ptr, size);

或者自己寫:

void secure_memzero(void* p, size_t len) {volatile unsigned char* vp = (volatile unsigned char*)p;while (len--) {*vp++ = 0;}
}

跨平臺、安全、可靠的 explicit_bzero 封裝實現

  • Linux(glibc >= 2.25)使用系統 explicit_bzero
  • macOS 使用 explicit_bzerobzero
  • Windows 使用 SecureZeroMemory
  • 其他平臺使用手動 volatile 寫法

跨平臺安全內存清除封裝

#pragma once#include <cstddef>  // for size_t#if defined(_WIN32)#include <windows.h>
#elif defined(__has_include)#if __has_include(<string.h>)#include <string.h>#endif
#endifnamespace secure {// 可移植 secure_memzero 封裝
inline void memzero(void* ptr, size_t len) {if (!ptr || len == 0) return;#if defined(_WIN32)// Windows 安全 APISecureZeroMemory(ptr, len);#elif defined(__GLIBC__) && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 25))// glibc 2.25+ 提供 explicit_bzeroexplicit_bzero(ptr, len);#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__)// macOS / BSD 系統一般也有 explicit_bzeroexplicit_bzero(ptr, len);#else// 手動 volatile 寫法,防止優化器移除volatile unsigned char* p = reinterpret_cast<volatile unsigned char*>(ptr);while (len--) {*p++ = 0;}
#endif
}} // namespace secure

使用方式

#include "secure_memzero.hpp"int main() {char password[32] = "MySecretPassword";// ... 使用 password ...// 安全清除secure::memzero(password, sizeof(password));return 0;
}

測試建議

  1. Release 模式下測試,確保 secure::memzero 不被優化掉。
  2. 檢查編譯器匯編輸出(例如 objdump -d)確保有寫入指令。
  3. 如在密碼模塊中使用,建議配合內存保護機制(如 mlock)以防 swap 泄露。

優點

特性描述
安全防止編譯器優化清零操作
跨平臺兼容 Linux/macOS/Windows/FreeBSD 等系統
無依賴不依賴 C11 memset_s
可內聯單頭文件,適用于庫內/項目中任意使用

總結

特性說明
安全不會被編譯器優化
用途清除密碼、私鑰等敏感數據
可移植性glibc 2.25+、BSD、macOS 支持,Windows 需替代方案
推薦場景密碼學、加密庫、認證信息清除等

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

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

相關文章

MySQL 鏈接方法思考

代碼: import subprocess import os from dotenv import load_dotenv import pymysql from sqlalchemy import create_enginedef check_mysql_service():"""檢查 MySQL 服務是否運行"""try:result = subprocess.run(["systemctl", &…

jxORM--查詢數據

jxORM提供了豐富的數據查詢功能。在jxORM中&#xff0c;有兩種數據查詢方式&#xff1a; 通過數據類執行查詢直接使用SQL的select語句查詢 數據類查詢 數據類查詢的優勢&#xff1a; 可以根據數據類的定義&#xff0c;自動完成查詢條件中的條件值和查詢到的數據的類型轉換直接獲…

詳解力扣高頻SQL50題之1084. 銷售分析 III【簡單】

傳送門&#xff1a;1084. 銷售分析 III 題目 表&#xff1a; Product --------------------- | Column Name | Type | --------------------- | product_id | int | | product_name | varchar | | unit_price | int | --------------------- product_id 是該表的主鍵&#x…

Kafka入門指南:從零開始掌握分布式消息隊列

為什么要有消息隊列 生活中有這樣的場景快遞員將包裹送給買家。 我記得在小時候&#xff0c;收快遞是需要快遞員電話聯系上門時間的。這非常不方便&#xff0c;一方面快遞員手中可能有多個包裹&#xff0c;另一方面買家可能在上班時間抽不出身。 后來有了驛站&#xff0c;快遞員…

基于Matlab圖像處理的瓶子自動檢測與質量評估系統

本文提出了一種基于圖像處理的瓶子缺陷檢測系統&#xff0c;旨在通過圖像分析自動識別和檢測瓶子在生產過程中可能出現的缺陷。系統首先通過圖像預處理技術&#xff0c;包括灰度轉換、二值化處理、噪聲去除等步驟&#xff0c;將原始圖像轉換為適合分析的格式。然后&#xff0c;…

【Pandas】pandas Index objects Index.name

Pandas2.2 Index objects Properties方法描述Index.values返回 Index 對象的值&#xff0c;通常是一個 NumPy 數組Index.is_monotonic_increasing用于檢查索引的元素是否 單調遞增Index.is_monotonic_decreasing用于判斷索引的值是否 單調遞減Index.is_unique用于檢查索引中的標…

JDBC教程,2025版最新講解.超詳細入門教程

以下內容全面詳盡地梳理了 JDBC &#xff08;Java Database Connectivity&#xff09;的核心知識點&#xff0c;并在關鍵環節配以示例代碼。若要快速定位&#xff0c;可先查看下方結構&#xff1a; JDBC 概覽驅動加載與注冊獲取數據庫連接執行 SQL&#xff08;Statement、Prepa…

PyTorch中nn.Module詳解和綜合代碼示例

在 PyTorch 中&#xff0c;nn.Module 是神經網絡中最核心的基類&#xff0c;用于構建所有模型。理解并熟練使用 nn.Module 是掌握 PyTorch 的關鍵。一、什么是 nn.Module nn.Module 是 PyTorch 中所有神經網絡模塊的基類。可以把它看作是“神經網絡的容器”&#xff0c;它封裝了…

深入解析三大Web安全威脅:文件上傳漏洞、SQL注入漏洞與WebShell

文章目錄文件上傳漏洞SQL注入漏洞WebShell三者的核心關聯&#xff1a;攻擊鏈閉環文件上傳漏洞 文件上傳漏洞&#xff08;File Upload Vulnerability&#xff09; 當Web應用允許用戶上傳文件但未實施充分的安全驗證時&#xff0c;攻擊者可上傳惡意文件&#xff08;如WebShell、…

【對比】群體智能優化算法 vs 貝葉斯優化

在機器學習、工程優化和科學計算中&#xff0c;優化算法的選擇直接影響問題求解的效率與效果。群體智能優化算法&#xff08;Swarm Intelligence, SI&#xff09;和貝葉斯優化&#xff08;Bayesian Optimization, BO&#xff09;是兩種截然不同的優化范式&#xff0c;分別以不同…

LLMs之Agent:ChatGPT Agent發布—統一代理系統將研究與行動無縫對接,開啟智能助理新時代

LLMs之Agent&#xff1a;ChatGPT Agent發布—統一代理系統將研究與行動無縫對接&#xff0c;開啟智能助理新時代 目錄 OpenAI重磅發布ChatGPT Agent—統一代理系統將研究與行動無縫對接&#xff0c;開啟智能助理新時代 第一部分&#xff1a;Operator 和深度研究的自然演進 第…

Linux726 raid0,raid1,raid5;raid 創建、保存、停止、刪除

RAID創建 創建raid0 安裝mdadm yum install mdadm mdadm --create /dev/md0 --raid-devices2 /dev/sdb5 /dev/sdb6 [rootsamba caozx26]# mdadm --create /dev/md0 --raid-devices2 /dev/sdb3 /dev/sdb5 --level0 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev…

深入剖析 MetaGPT 中的提示詞工程:WriteCode 動作的提示詞設計

今天&#xff0c;我想和大家分享關于 AI 提示詞工程的文章。提示詞&#xff08;Prompt&#xff09;是大型語言模型&#xff08;LLM&#xff09;生成高質量輸出的關鍵&#xff0c;而在像 MetaGPT 這樣的 AI 驅動軟件開發框架中&#xff0c;提示詞的設計直接決定了代碼生成的可靠…

關于 ESXi 中 “ExcelnstalledOnly 已禁用“ 的解決方案

第一步&#xff1a;使用ssh登錄esxi esxcli system settings advanced list -o /User/execInstalledOnly可能會得到以下內容 esxcli system settings advanced list -o /User/execInstalledOnlyPath: /User/ExecInstalledOnlyType: integerInt Value: 0Default Int Value: 1Min…

HTML5 Canvas 繪制圓弧效果

HTML5 Canvas 繪制圓弧效果 以下是一個使用HTML5 Canvas繪制圓弧的完整示例&#xff0c;你可以直接在瀏覽器中運行看到效果&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"view…

智能Agent場景實戰指南 Day 18:Agent決策樹與規劃能力

【智能Agent場景實戰指南 Day 18】Agent決策樹與規劃能力 開篇 歡迎來到"智能Agent場景實戰指南"系列的第18天&#xff01;今天我們將深入探討智能Agent的核心能力之一&#xff1a;決策樹與規劃能力。在現代業務場景中&#xff0c;Agent需要具備類似人類的決策能力…

AI 編程工具 Trae 重要的升級。。。

大家好&#xff0c;我是櫻木。 今天打開 Trae &#xff0c;已經看到它進行圖標升級&#xff0c;之前的圖標&#xff0c;國際和國內版本長得非常像&#xff0c;現在做了很明顯的區分&#xff0c;這點給 Trae 團隊點個贊。 自從 Claude 使出了壓力以來&#xff0c;Cursor 鎖區&…

排序算法,咕咕咕

1.選擇排序void selectsort(vector<int>& v) { for(int i0;i<v.size()-1;i) {int minii;for(int ji1;j<v.size();j){if(v[i]>v[j]){minij;}}if(mini!i)swap(v[i],v[mini]); } }2.堆排序void adjustdown(vector<int>& v,int root,int size) { int …

數據庫查詢系統——pyqt+python實現Excel內查課

一、引言 數據庫查詢系統處處存在&#xff0c;在教育信息化背景下&#xff0c;數據庫查詢技術更已深度融入教務管理場景。本系統采用輕量化架構&#xff0c;結合Excel課表&#xff0c;通過PythonPyQt5實現跨平臺桌面應用&#xff0c;以實現簡單查課效果。 二、GUI界面設計 使用…

base64魔改算法 | jsvmp日志分析并還原

前言 上一篇我們講了標準 base64 算法還原&#xff0c;為了進一步學習 base64 算法特點&#xff0c;本文將結合 jsvmp 日志&#xff0c;實戰還原出 base64 魔改算法。 為了方便大家學習&#xff0c;我將入參和上篇文章一樣&#xff0c;入參為 Hello, World!。 插樁 在js代碼中&…