2016-05-07 71 views
3

我想知道,如果有可能在某個庫中分配一個單獨的內存區域,使得使用該庫的應用程序無法直接訪問它。如何分配單獨的內存來存儲機密數據?

可以說這個庫暴露了一個類,它需要機密數據才能操作。例如,下面的類中,該類的一個實例包含一個機密的訪問令牌,這將允許惡意用戶無需登錄即可訪問數據庫。

class Session { 
public: 
    Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(database) {} 
    virtual ~Session(){} 

    bool renew_login(const std::string& password); 
private: 
    const Database* db; 
    long login_exiration_date; 

    // confidential data: 
    std::string username;  
    char confidental_accesstoken[128]; 
}; 

當我有一個Session實例名爲s,其中用戶當前登錄的,我將能夠通過鑄造& s到一個字符指針簡單的提取的accessToken。

現在,我想這個類重新實現以下面的類:

class Session { 
public: 
    Session(const Database *database, const std::string& name) : username(name), login_expires(-1), db(database) {} 
    virtual ~Session(){} 

    bool renew_login(const std::string& password); 
private: 
    const Database* db; 
    long login_exiration_date; 

    long some_temporary_id; 
}; 

如果該類會議聲明如下,它不再是可能的最終應用來訪問機密數據,因爲它不再存儲在會話實例本身內部。


該問題:

我有簡單地通過使用指針運算的機密數據存儲在這樣一種方式,它不能在最終應用進行訪問。

我知道,我無法保護數據,使得root用戶無法將所有內存轉儲到磁盤並進行搜索,但這不是我想要完成的目標。

我想在我的庫中有一個私有內存空間,這樣具有普通訪問權限的普通用戶空間應用程序必須使用我的接口才能使用這些受限制的資源。

有什麼辦法可以做到這一點?

+5

您需要一個單獨的進程來保存數據。根據定義,任何在同一進程中運行的代碼都會看到相同的地址空間。 –

+1

使用一個單獨的進程,並在其中您可以選擇'mlock'安全內存,以防止它交換到磁盤。這就是像gnupg這樣的安全軟件。 – PSkocik

回答

0

我不相信你有任何存儲數據的機會,使得它無法被同一進程中的其他函數訪問。通過將數據存儲在某個文件/ thread_local變量中,可以使其變得更加困難,但同樣,這隻會隱藏數據,而不能保護數據。