干货!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