現(xiàn)在我們已經(jīng)向用戶詢問(wèn)了密碼,或者為他們生成了密碼,我們?cè)撊绾翁幚硭??我們可能希望將其存?chǔ)在數(shù)據(jù)庫(kù)中的某個(gè)地方,但您可能(希望)知道,您不應(yīng)該以明文格式存儲(chǔ)密碼。那是為什么?
那么,密碼不應(yīng)該以可恢復(fù)的格式存儲(chǔ),無(wú)論是純文本還是加密的。它們應(yīng)該使用加密強(qiáng)的單向函數(shù)進(jìn)行散列。這樣,如果有人掌握了數(shù)據(jù)庫(kù)中的密碼,他們將很難恢復(fù)任何實(shí)際的密碼,因?yàn)閺纳⒘兄谢謴?fù)任何密碼的唯一方法是強(qiáng)行–也就是說(shuō)–使用可能的明文密碼,用相同的算法對(duì)它們進(jìn)行散列,并將結(jié)果與數(shù)據(jù)庫(kù)中的條目進(jìn)行比較。
為了讓蠻力變得更難,另外
食鹽
應(yīng)該用。SALT是存儲(chǔ)在散列密碼旁邊的隨機(jī)字符串。在散列之前,它會(huì)被附加到密碼中,這使得它更加隨機(jī),因此很難猜測(cè)(使用彩虹桌 ).
然而,由于現(xiàn)代硬件每秒可嘗試數(shù)十億次散列,因此,僅憑密碼難以猜測(cè)是不夠的。
慢的
散列函數(shù)用于密碼散列,使得攻擊者強(qiáng)行使用密碼的效率要低得多。
(注:以上所述大大簡(jiǎn)化了使用這些散列函數(shù)的邏輯和原因。有關(guān)更多深思熟慮的解釋,請(qǐng)參見(jiàn)文章 .)
有相當(dāng)多的庫(kù)和單獨(dú)的散列算法,但上述要求大大縮小了我們的選擇范圍。在Python中進(jìn)行散列的解決方案應(yīng)該是passlib因?yàn)樗峁┝苏_的算法,以及高級(jí)接口,即使是那些對(duì)密碼學(xué)不太精通的人也可以使用。
pip install passlib
from passlib.hash import bcrypt
from getpass import getpass
print(bcrypt.setting_kwds)
(‘salt’, ‘rounds’, ‘ident’, ‘truncate_error’)
print(bcrypt.default_rounds)
12
hasher = bcrypt.using(rounds=13) # Make it slower
password = getpass()
hashed_password = hasher.hash(password)
print(hashed_password)
$2b 13 13 13H9.qdcodBFCYOWDVMrjx/uT.fbKzYloMYD7Hj2ItDmEOnX5lw.BX.
_// _/___________/
Alg Rounds Salt (22 char) Hash (31 char)
print(hasher.verify(password, hashed_password))
True
print(hasher.verify(“not-the-password”, hashed_password))
False
在我們使用的片段中bcrypt作為我們選擇的算法,因?yàn)樗亲盍餍泻蜏y(cè)試最充分的哈希算法之一。首先,我們檢查它的可能設(shè)置并檢查算法使用的默認(rèn)輪數(shù)。然后修改
哈希爾
使用更多的回合(成本因素)使哈希速度變慢,因此哈希更難破解。這個(gè)數(shù)字應(yīng)該是最大的,不會(huì)給您的用戶造成不可容忍的延遲(~300 ms)。passlib定期更新默認(rèn)循環(huán)值,因此不一定需要更改此值。
在HASHER準(zhǔn)備就緒后,我們提示用戶輸入密碼并將其散列。此時(shí),我們可以將其存儲(chǔ)在數(shù)據(jù)庫(kù)中,為了演示起見(jiàn),我們繼續(xù)使用原始明文密碼驗(yàn)證它。
從上面的代碼中,我們可以看到passlib歸結(jié)為hash和modify我們算法選擇的方法。然而,如果你想對(duì)計(jì)劃、回合等有更多的控制權(quán),那么你可以使用CryptContext班級(jí):
from passlib.context import CryptContext
ctx = CryptContext(schemes=[“bcrypt”, “argon2”, “scrypt”],
default=“bcrypt”,
bcrypt__rounds=14)
password = getpass()
hashed_password = ctx.hash(password)
print(hashed_password)
$2b 14 14 14pFTXqnHjn91C8k8ehbuM.uSJM.H5S0l7vkxE8NxgAiS2LiMWMziAe
print(ctx.verify(password, hashed_password))
print(ctx.verify(“not-the-password”, hashed_password))
此上下文對(duì)象允許我們處理多個(gè)方案、設(shè)置默認(rèn)值或配置成本因素。如果您的應(yīng)用程序身份驗(yàn)證很簡(jiǎn)單,那么這可能是不必要的,但是如果您需要使用多個(gè)散列算法、不推薦它們、重新哈希哈?;蝾愃频母呒?jí)任務(wù)的能力,那么您可能需要查看全文。CryptContext整合補(bǔ)習(xí) .
另一個(gè)你想用的理由CryptContext如果您需要處理操作系統(tǒng)密碼,如/etc/shadow。為此,可以使用passlib.hosts,有關(guān)詳細(xì)信息,請(qǐng)參閱示例。這里 .
為了完整起見(jiàn),我還列出了其他幾個(gè)可用庫(kù),包括它們的(不同的)用例:
-
Bcrypt是我們上面使用的庫(kù)和算法。這是由以下人員使用的相同代碼:passlib沒(méi)有真正的理由使用這個(gè)低級(jí)別的庫(kù)。
-
地窖是一個(gè)Python標(biāo)準(zhǔn)庫(kù)模塊,它提供了能用于密碼散列。然而,所提供的算法依賴于您的系統(tǒng),而文檔中列出的算法不如上面所示的強(qiáng)。
-
Hashlib是另一個(gè)內(nèi)置模塊。然而,這一個(gè)包含了強(qiáng)大的哈希功能,適合密碼哈希。這個(gè)庫(kù)的接口使函數(shù)更加可定制,因此需要更多的知識(shí)才能正確地(安全地)使用。您絕對(duì)可以使用來(lái)自此模塊的函數(shù),例如hashlib.scrypt你的密碼。
-
HMAC,Python標(biāo)準(zhǔn)庫(kù)提供的最后一個(gè)散列模塊不適合密碼散列。HMAC用于驗(yàn)證消息的完整性和真實(shí)性,并且不具有密碼散列所需的屬性。
注意:新獲得的關(guān)于正確存儲(chǔ)密碼的方法的知識(shí),讓我們想象一下,您忘記了某些服務(wù)的密碼。你點(diǎn)擊
“忘記密碼了?”
在網(wǎng)站上,而不是恢復(fù)鏈接,他們給你的實(shí)際密碼。這意味著他們將您的密碼存儲(chǔ)在明文中,這也意味著您應(yīng)該逃離該服務(wù)(如果您在其他地方使用了相同的密碼,那么就更改它)。
安全儲(chǔ)存
====
在上一節(jié)中,我們假設(shè)目的是存儲(chǔ)其他用戶的憑據(jù),但是您自己用來(lái)登錄到遠(yuǎn)程系統(tǒng)的密碼呢?
將密碼保留在代碼中顯然是一個(gè)糟糕的選擇,因?yàn)樗且悦魑男问教峁┙o任何人看的,而且您也有可能意外地將密碼推到gitrepo上。更好的選擇是將其存儲(chǔ)在環(huán)境變量中。你可以創(chuàng)建.env文件,將其添加到.gitignore,將其填充到當(dāng)前項(xiàng)目所需的憑據(jù)中。然后你可以用dotenv將所有這些變量打包到應(yīng)用程序中,如下所示:
pip install python-dotenv
import os
from os.path import join, dirname
from dotenv import load_dotenv
dotenv_path = join(dirname(file), “.env”)
load_dotenv(dotenv_path)
API_KEY = os.environ.get(“API_KEY”, “default”)
print(API_KEY)
a3491fb2-000f-4d9f-943e-127cfe29c39c
這個(gè)片段首先構(gòu)建到.env文件使用os.path函數(shù),然后使用這些函數(shù)加載環(huán)境變量。load_dotenv()。如果你.env文件位于當(dāng)前目錄中,如上面的示例所示,那么您可以簡(jiǎn)化代碼,只需調(diào)用load_dotenv(find_dotenv())自動(dòng)找到環(huán)境文件。加載文件時(shí),剩下的就是使用os.environ.get .
或者,如果您不想用應(yīng)用程序變量和秘密污染您的環(huán)境,您可以像這樣直接加載它們:
from dotenv import dotenv_values
config = dotenv_values(“.env”)
print(config)
OrderedDict([(‘API_KEY’, ‘a(chǎn)3491fb2-000f-4d9f-943e-127cfe29c39c’)])
上面的解決方案很好,但我們可以做得更好。與其將密碼存儲(chǔ)在不受保護(hù)的文件中,我們還可以使用系統(tǒng)的
鍵環(huán)
,該應(yīng)用程序可以將安全憑據(jù)存儲(chǔ)在主目錄中的加密文件中。默認(rèn)情況下,該文件使用用戶帳戶登錄密碼進(jìn)行加密,因此在登錄時(shí)會(huì)自動(dòng)解鎖,因此不必?fù)?dān)心額外的密碼。
要在Python應(yīng)用程序中使用keyring憑據(jù),我們可以使用名為keyring :
pip install keyring
import keyring
import keyring.util.platform_ as keyring_platform
自我介紹一下,小編13年上海交大畢業(yè),曾經(jīng)在小公司待過(guò),也去過(guò)華為、OPPO等大廠,18年進(jìn)入阿里一直到現(xiàn)在。
深知大多數(shù)網(wǎng)絡(luò)安全工程師,想要提升技能,往往是自己摸索成長(zhǎng),但自己不成體系的自學(xué)效果低效又漫長(zhǎng),而且極易碰到天花板技術(shù)停滯不前!
因此收集整理了一份《2024年網(wǎng)絡(luò)安全全套學(xué)習(xí)資料》,初衷也很簡(jiǎn)單,就是希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友。
既有適合小白學(xué)習(xí)的零基礎(chǔ)資料,也有適合3年以上經(jīng)驗(yàn)的小伙伴深入學(xué)習(xí)提升的進(jìn)階課程,基本涵蓋了95%以上網(wǎng)絡(luò)安全知識(shí)點(diǎn),真正體系化!
由于文件比較大,這里只是將部分目錄大綱截圖出來(lái),每個(gè)節(jié)點(diǎn)里面都包含大廠面經(jīng)、學(xué)習(xí)筆記、源碼講義、實(shí)戰(zhàn)項(xiàng)目、講解視頻,并且后續(xù)會(huì)持續(xù)更新
如果你覺(jué)得這些內(nèi)容對(duì)你有幫助,可以添加VX:vip204888 (備注網(wǎng)絡(luò)安全獲?。?/strong>
學(xué)習(xí)路線:
這個(gè)方向初期比較容易入門(mén)一些,掌握一些基本技術(shù),拿起各種現(xiàn)成的工具就可以開(kāi)黑了。不過(guò),要想從腳本小子變成黑客大神,這個(gè)方向越往后,需要學(xué)習(xí)和掌握的東西就會(huì)越來(lái)越多以下是網(wǎng)絡(luò)滲透需要學(xué)習(xí)的內(nèi)容:
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
從腳本小子變成黑客大神,這個(gè)方向越往后,需要學(xué)習(xí)和掌握的東西就會(huì)越來(lái)越多以下是網(wǎng)絡(luò)滲透需要學(xué)習(xí)的內(nèi)容:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857023.html
一個(gè)人可以走的很快,但一群人才能走的更遠(yuǎn)。不論你是正從事IT行業(yè)的老鳥(niǎo)或是對(duì)IT行業(yè)感興趣的新人,都?xì)g迎掃碼加入我們的的圈子(技術(shù)交流、學(xué)習(xí)資源、職場(chǎng)吐槽、大廠內(nèi)推、面試輔導(dǎo)),讓我們一起學(xué)習(xí)成長(zhǎng)!
[外鏈圖片轉(zhuǎn)存中…(img-ZNGkmKoX-1713018979790)]文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857023.html
到了這里,關(guān)于Python中的安全密碼處理,非常重要!知道這些黑客也奈何不了你!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!