簡體   English   中英

安全地存儲無法加密的憑據

[英]Securely storing credentials that can't be encrypted

我有一個正在運行來自多個帳戶的信息匯總器的客戶端。 數據庫需要以其他方式將用戶名和密碼存儲到其他網站,腳本以后可以使用該方式登錄到那些網站以檢索數據。

我認為與其將它們存儲為純文本,不如將其哈希存儲。 顯然,如果某人可以訪問代碼和數據庫,那么他們仍然可以訪問純文本版本,但如果只有一個或另一個,則不能訪問純文本版本。

還有更好的主意嗎?

如果系統要求用戶輸入密碼,則可以使用該密碼生成密鑰來加密/解密其他網站的密碼。

這樣,您需要用戶輸入該密碼才能解密您存儲在數據庫中的密碼。

這里有更詳細的流程:

  1. 用戶登錄系統時輸入密碼“ 123456”。
  2. 您使用“ 123456”密碼的SHA256並獲得一個密鑰:“ 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020cc923adc6c92”
  3. 使用該“ 8d969 ...”密鑰使用AES解密數據庫中站點的密碼。

您可以通過多種方式對此進行優化。 例如:在計算SHA哈希之前先對密碼加鹽。

作為此類鹽腌的實際示例, Michael建議使用PBKDF2 (將HMAC - SHA-256作為其兩個參數偽隨機函數)。

其他增強功能:存儲密鑰的加密版本,以允許您的用戶更改自己的密碼,而不必重新加密其所有密碼...等等...

您可以使用憑據進行任何操作,攻擊者也可以

混淆實際上能買到什么? 時間。 畢竟,數據就在那里,您自己使用它的方案也是如此。 有人弄清楚您的方案只是時間問題。 這一切都取決於您的偏執程度以及對您所適應的風險程度的評估。 特別是,如何存儲任何憑據應取決於誰有權訪問運行數據庫的計算機。

最終,橡膠必須上路,所以繼續前進並征服它。 不要完全敲打混淆。 只要確保將其與明智的做法相結合即可。

方法與建議

為每個帳戶生成每個應用程序的API密鑰,以供計算機使用

如果您可以從第三方帳戶生成API密鑰,則可以在不關閉所有潛在應用程序的情況下撤消對帳戶的訪問權限。 許多服務都具有這些類型的API密鑰(Google,Twitter,StackExchange,Facebook等)。

您只需設置一個“應用程序”,然后使用使用者密鑰和機密以及訪問令牌和訪問機密。 機器只需要存儲這些憑據。 如果發生折衷,您只需撤銷該組鍵即可。 此外,這些允許您指定每個帳戶的權限。

使用每個用戶的密碼作為其憑據集

用戶登錄后,才可以解鎖他們的密碼集。 為此,您將基於適當的哈希方案和驗證檢查生成密鑰,該檢查在密鑰之前進行了多個哈希步驟。

無論如何都將其加密在磁盤上

您始終可以使用一個密鑰來加密憑據。 這樣,您只有一個密鑰可以保護(保護所有其他秘密)。 然后,您將必須解密才能訪問其他憑據。

將機密存儲在系統的密鑰環中

在Linux上,使用gnome-keyring 然后,您可以進行簡單的Create-Read-Update-Delete調用,將其視為密碼數據庫。 Gnome密鑰環基於PKCS#11標准。

gnome-keyring具有一個API,用於保存到密鑰環和檢索項目。

/* A callback called when the operation completes */
static void
found_password (GnomeKeyringResult res, const gchar* password, gpointer user_data)
{
  /* user_data will be the same as was passed to gnome_keyring_find_password() */
  // ... do something with the password ...
  /* Once this function returns |password| will be freed */
}

static void
find_my_password()
{
  gnome_keyring_find_password (GNOME_KEYRING_NETWORK_PASSWORD,  /* The password type */
                               found_password,                  /* callback */
                               NULL, NULL,     /* User data for callback, and destroy notify */
                               "user", "me", 
                               "server", "gnome.org",
                               NULL);
}

在Windows 7+上,使用“加密文件系統”(EFS)功能。 所有文件均使用證書進行加密,依次使用Windows密碼進行保護。

但是,不要讓這種情況使您陷入一種錯誤的安全感。 如果這是一台正在運行的服務器,則如果有人可以通過網絡訪問該設備,那么他們也可以自己訪問密鑰環數據。

設置授予訪問權限的遠程計算機

您是否可以設置一台可以使用公鑰和私鑰對授予憑據或解鎖密鑰訪問權限的計算機?

關於哈希

如果您對用戶名和密碼進行哈希處理,則不會找回它們。 哈希被設計為單向函數。

您可以數據進行編碼以進行混淆,但是我不建議這樣做。

如果對信息進行散列,則以后將無法檢索它。 如果對其進行加密,則需要將密鑰存儲在某處。 除了從物理上限制對數據庫的訪問之外,沒有可靠的方法來消除惡意使用數據的可能性。

散列可以以所有可預見的方式阻止使用原始數據。 但是,您需要使用數據。 像SHA-256這樣的密碼哈希被設計成使得在給定H(m)情況下很難找到計算m方法(不生成大小不合理的查找表),其中H是您最喜歡的哈希函數。

如果走加密路線,則需要存儲加密密鑰,並且它可能會受到威脅或至少用作解密預言。 您可以使服務代理為您執行解密,並同時使用客戶端和服務器身份驗證證書來確保安全。 但是,如果有人泄露了授權的客戶,則您在泄露和發現帳戶可能遭到泄露之間有一段時間間隔。 但是,這種方法使您可以靈活地撤銷證書並立即拒絕服務器訪問,即使您再也無法訪問受感染的客戶端。

我建議設置一個遠程服務,該服務僅可通過直接連接(在同一物理交換機上)使用,並且必須向客戶端進行身份驗證並要求所有客戶端進行身份驗證。 如果要讓客戶受到損害,也許限制它可以進行的查詢數量也將有助於防止濫用。 該服務將需要針對每個請求檢查證書吊銷。

該服務還需要連接到遠程日志記錄設施,該設施將用於獨立審核系統。 此日志記錄服務需要再次對客戶端進行身份驗證,並向客戶端進行身份驗證。 日志記錄服務接收數據並將其附加到日志,它永遠不允許修改或刪除。 收到日志條目后,它將對帶時間戳的日志條目進行數字簽名,然后將其輸入審核容器。

這類似於證書頒發機構設置其紙質記錄以審核證書頒發的方式,以便為折衷方案提供最佳的恢復模型,因為實際上防止折衷方案是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM