是否可以使用GTK3库手动擦除GtkEntry的内存?

问题描述 投票:1回答:1

我有一个指向GtkEntry的指针,该指针包含用户输入的密码。我想在完成GtkEntry之后在存储块上调用Libsodium的安全memset函数。这是一个无效的示例,概述了我要执行的操作:

GtkEntry *entry = GTK_ENTRY(gtk_builder_get_object(builder, "passwordEntry"));

...

const gchar *password = gtk_entry_get_text(entry);
gint length = gtk_entry_get_text_length(entry);

...

sodium_memzero(password, length);   // Undefined behaviour

API为gtk_entry_get_text()指定:

此字符串指向窗口小部件内部分配的存储空间,不得释放,修改或存储。

因此,我想知道是否可以在不调用未定义行为的情况下做到这一点?

c security memory-management gtk gtk3
1个回答
0
投票

GtkEntry使用GtkEntryBuffer来管理文本。当GtkEntryBuffer中存储的文本(或关联的GtkEntry)被释放时(即,在g_object_unref上),该文本将清零。请参见其源代码12

如果您想使用更好的安全缓冲区来保存密码,可以尝试GcrSecureEntryBuffer。但这需要您的项目依赖gcr

或者,如果您确实想使用libsodium,则可以将GtkEntryBuffer子类化,并自行进行内存管理,并使用该缓冲区创建GtkEntry

© www.soinside.com 2019 - 2024. All rights reserved.