首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现AnsiString对象零点的正确方法

实现AnsiString对象零点的正确方法
EN

Stack Overflow用户
提问于 2017-05-23 16:14:40
回答 1查看 122关注 0票数 0

如何使AnsiString对象为零?例如:

代码语言:javascript
复制
void TesteClass::test()
{
    AnsiString cardNumber = "1234567890123456";
    ..
}

AnsiString对象被自动销毁,但其内部数据未被清除,因此内存获取工具可以读取信息。我们需要将这些数据归零,以避免在内存中捕获敏感信息。

AnsiString类具有直接访问内部数据的方法c_str(),但不建议这样做:

代码语言:javascript
复制
memset(cardNumber.c_str(), 0, cardNumber.Length());

在销毁对象之前,对AnsiString内部数据进行零化的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-23 19:58:25

像您所展示的那样,使用memset()没有什么问题。以这种方式使用c_str()是正确的(只要您不超过Length(),因为如果AnsiString是空的,c_str()返回一个指向AnsiString的指针):

代码语言:javascript
复制
void TesteClass::test()
{
    AnsiString cardNumber = "1234567890123456";
    // ...
    memset(cardNumber.c_str(), 0, cardNumber.Length());
}

由于您担心信息泄漏,请考虑使用SecureZeroMemory()而不是memset() (参见SecureZeroMemory的意义是什么?)。

要自动化零化(所以您不必记住要这样做),请考虑将AnsiString封装到RAII样式的class/struct中(不能直接从AnsiString派生,RTL不允许),其析构函数执行零化,然后在需要的地方使用class/struct,而不是直接使用AnsiString

只是要小心,因为AnsiString使用引用计数的数据,所以不要对数据进行零点,除非您的AnsiString是引用数据的唯一实例:

代码语言:javascript
复制
class SaferAnsiString
{
private:
    AnsiString m_Str;

    void CheckZeroNeeded()
    {
        // AnsiString gained a public RefCount() method in C++Builder 2009.
        // In earlier versions, access the reference count manually...
        #ifdef _DELPHI_STRING_UNICODE
        if (m_Str.RefCount() == 1)
        #else
        const void *data = m_Str.data();
        if ((data) && (static_cast<const int*>(data)[-2] == 1))
        #endif
            SecureZeroMemory(m_Str.c_str(), m_Str.Length());
    }

public:
    SaferAnsiString(const AnsiString &src = AnsiString())
        : m_Str(src)
    {
    }

    ~SaferAnsiString()
    {
        CheckZeroNeeded();
    }

    SaferAnsiString& operator=(const AnsiString &rhs)
    {
        CheckZeroNeeded();
        m_Str = rhs;
        return *this;
    }

    operator AnsiString () const { return m_Str; }

    // other methods as needed...
};

代码语言:javascript
复制
void TesteClass::test()
{
    SaferAnsiString cardNumber = "1234567890123456";
    // ...
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44140088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档