2013-04-09 37 views
5

假設我以一個字符串的形式在一個名爲passWd的變量中以明文形式存儲密碼。 如何蟒蛇發佈這個變量一旦我放棄它(例如,用del passWdpassWd= 'new random data')?Python - 發佈/替換字符串變量,它如何處理?

被存儲爲字節數組這意味着它可以在memoryplace被覆蓋,它原先就存在或者是它的字符串的固定在不能assining一個新值時,一個用於進行修改和存在的存儲器區域設定新的內存區域被創建並且舊區域被丟棄但不被null覆蓋?

我質疑的Python是如何實現的內存區域的安全,並想知道更多一點,主要是因爲我很好奇:)

從我迄今收集,使用del(或__del__)解釋器會不會釋放出可變全自動這可能會導致問題的存儲區域,並且還我不知道該德爾被等刪除值thurrow。但這只是從我收集的東西,而不是黑色或白色的東西:)

我問的主要原因是我打算寫一個移交的應用程序獲取一個字符串,做一些I/O,將它傳遞給另一個子系統(例如用於樹莓派的引導程序),並且接口是用Python編寫的(在某些人的耳朵裏聽起來有多奇怪..),我並不擔心數據在I/O計算,但在兩個子系統切換之間可能會發生內存轉儲。或者如果系統被凍結(說hiberation)說,20分鐘系統的引導和我一樣快,我可以刪除的變量之後,但不知何故,它仍然在內存,儘管我做了del passWd :)

(詩篇。我已經問過超級用戶,他們在這裏提到我,並且對於可憐的語法感到抱歉!)

+0

請參閱http://docs.python.org/2/c-api/memory.html – 2013-04-09 14:43:04

+0

我讀過所有這些,如果我不是不喜歡C它只是通過malloc分配一個內存區域,做一些東西與它並釋放它..在調用free()之後,它不會真正重寫那個內存區域中剩下的內容嗎? – Torxed 2013-04-09 14:44:22

+1

它剛剛被釋放。內存*可能會被別的東西使用,但是它沒有保證。 – 2013-04-09 14:45:32

回答

2

除非您使用自定義編碼輸入法獲取密碼,否則它將在很多地方,然後是您的不可變字符串。所以不要太擔心。

在內存分配給另一個進程之前,操作系統應該注意清除進程中的任何數據。如果頁面被複制到磁盤(換出或休眠),這當然可能會失敗。

安全的密碼輸入是不容易的。也許你可以找到一個專門的庫或模塊來處理這個問題。

+0

我正在考慮一個C實現來處理我需要使用的特定字符串,所以我可能會在那裏結束,因爲證據證明Python很好,我很懶,但它不夠安全在這個意義上(它並不是我所知道的)。 'getpass'對於用戶舒適區來說只是一個限制,它用'****'代替密碼,但實際上它只是一個帶有化妝的raw_input?還有更多,如果沒有,它會在您自動完成對數據區域的讀取之後替換數據區域嗎? – Torxed 2013-04-09 15:28:33

0

我終於有兩個解決方案了when。 ld_preload用於替換較低級別的Python字符串處理功能。 另一個更容易的選擇是開發我自己的C庫,它具有更多的功能,然後Python通過標準的字符串處理提供了更多的功能。

主要是C代碼有一個shread()函數,它寫入字符串「存儲」的內存區域以及一些其他錯誤檢查。

但是,@Ber給了我一個足夠好的答案來開始開發自己的解決方案,因爲(正如他指出的那樣)在Python中沒有安全的方法,python存儲字符串到許多地方,並依賴於操作系統,除非你不信任操作系統,否則你自己並不是一件壞事)。