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

Is it possible to manually wipe the memory of a GtkEntry using the GTK3 library?

我有一个指向 GtkEntry 的指针,其中包含用户输入的密码。完成 GtkEntry 后,我想在内存块上调用 Libsodium 的安全内存集函数。这是一个无效示例,概述了我正在尝试做的事情:

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() 指定:

This string points to internally allocated storage in the widget and must not be freed, modified or stored.

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

GtkEntry 使用 GtkEntryBuffer 来管理文本。存储在 GtkEntryBuffer 中的文本在它(或关联的 GtkEntry)被释放时被清零(即,在 g_object_unref 上) 查看它的源代码 1 and 2.

如果您想使用更安全的缓冲区来保存密码,您可以尝试 GcrSecureEntryBuffer. but that requires your project to depend on gcr

或者如果你真的想使用 libsodium,你可以继承 GtkEntryBuffer 并自己进行内存管理,然后使用该缓冲区创建 GtkEntry.