添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
帅气的松球  ·  JSON_ARRAYAGG | ...·  1小时前    · 
俊逸的充值卡  ·  printfactory · PyPI·  11 小时前    · 
心软的刺猬  ·  [Solved] Using C++ ...·  3 周前    · 
逼格高的饭盒  ·  python 泛型约束 ...·  1 月前    · 
俊秀的盒饭  ·  中共中央 ...·  2 月前    · 
怕老婆的仙人球  ·  GitHub - ...·  5 月前    · 
首发于 AI安全

干货!Python如何清除内存中的敏感数据

出于安全考虑,很多敏感数据在使用之后需要在内存中清除,比如秘钥、口令等等。那么在Python程序中使用的敏感数据,应该如何清除呢,这篇文章主要提供字符串和整数类型数据的清除方式。

字符串的内存擦除

这种情况的典型代表是使用python的加解密接口,需要传入字符串格式的秘钥(key)。我们可以使用下面的命令进行擦除:

import sys
import ctypes
length = len(key)
buffer_size = length + 1
offset = sys.getsizeof(key) - buffer_size
ctypes.memset(id(key) + offset, 0, length)

参考案例: 模型加密保护 - MindSpore master 文档

整数的内存擦除

由于整数没有len()方法,所以不能照搬上面的代码。分析上面代码的本质,就是使用ctypes.memset()擦除某个地址后面的一段数据,所以我们需要确定起始位置和擦除长度。根据这篇文章 [1] 可知,整数的存储格式如下:

struct PyLongObject{
long ob_refcnt;                // 引用计数,64位系统占8 bytes, 32位系统占4 bytes
struct_typeobject *ob_type;    // 类型指针,64位系统占8 bytes, 32位系统占4 bytes
long ob_size;                // 数据部分int的个数,64位系统占8 bytes, 32位系统占4 bytes
unsigned int ob_digit[1];    // 64位系统占4 bytes * abs(ob_size); 32位系统占2 bytes * abs(ob_size);
};

需要擦除的是ob_digit这段。所以整数类型的敏感数据可以这样擦除

import sys
import ctypes