Django 使用 bcrypt 生成密碼

需求

需要設(shè)計(jì)一個(gè)系統(tǒng)(采用Django)咳蔚,專門管理另一個(gè)系統(tǒng)的用戶。用戶登錄在另一個(gè)系統(tǒng)中進(jìn)行帆精,那邊的密碼采用bcrypt進(jìn)行校驗(yàn)柴墩,所以Django系統(tǒng)中密碼保存也要用bcrypt加密保存。

而Django雖然自帶的User中提供了Password功能(輸入明文铃岔、自動(dòng)生成加密字符串),但是model中卻并不提供一個(gè)所謂的PasswordField峭火。

因此毁习,需求就是如何在自己實(shí)現(xiàn)的注冊(cè)功能中,將明文密碼用bcrypt加密保存

設(shè)計(jì)

以前沒有安全方面“專業(yè)”知識(shí)累積卖丸,所以決定自己創(chuàng)建路由纺且、視圖、表單等組件稍浆,但是在查找資料的過程中發(fā)現(xiàn)了許多可用的資料载碌。

但是提前優(yōu)化是萬惡之源,我沒有決定中途改換技術(shù)方案衅枫,而是等待下一版再更改為更專業(yè)的方案嫁艇。

創(chuàng)建路由、視圖弦撩、表單步咪、模板等過程都比較簡(jiǎn)單,就不在贅述了益楼,著重講下如何將明文密碼進(jìn)行加密的過程歧斟。

下載bcrypt

Python 版的 bcrypt 的 網(wǎng)站,安裝命令:pip install bcrypt

實(shí)現(xiàn)

接下來偏形,在form的 clean_password() 函數(shù)里静袖,返回加密后的字符串。

import bcrypt

class SignUpForm(forms.Form):
    password1 = forms.CharField(
        required=True,
        widget=forms.PasswordInput(attrs={'placeholder': '輸入密碼', 'class': 'input pass'})
    )
    password2 = forms.CharField(
        required=True,
        widget=forms.PasswordInput(attrs={'placeholder': '再次輸入密碼', 'class': 'input pass'})
    )


    def clean_password2(self):
        cleaned_data =  super(SignUpForm, self).clean()
        password2 = cleaned_data.get('password2')

        return bcrypt.hashpw(password2, bcrypt.gensalt())

在views里取值時(shí)用form.cleaned_data['password2']即可取到加密后的字符串俊扭,驗(yàn)證功能在需求部分已經(jīng)做過介紹队橙,不需要django這部分負(fù)責(zé)。

排坑

我的django是基于python3的,在python2里測(cè)試生成加密字符串的過程沒有問題捐康,但是在python3會(huì)報(bào)如下錯(cuò)誤:

Unicode-objects must be encoded before hashing

查找了下原因仇矾,是因?yàn)閜ython3里,字符串有strbytes兩種形態(tài)解总,所以需要改成

bcrypt.hashpw(password2.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

另外贮匕,bcrypt有多種標(biāo)準(zhǔn),我們需要的是2a花枫,所以還要改成:

bcrypt.hashpw(password2.encode('utf-8'), bcrypt.gensalt(prefix=b'2a')).decode('utf-8')

這樣就得到正確結(jié)果了刻盐。

結(jié)果

image

可以看到password的值已經(jīng)是bcrypt加密后的字符串了。

相關(guān)資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末劳翰,一起剝皮案震驚了整個(gè)濱河市敦锌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佳簸,老刑警劉巖乙墙,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異生均,居然都是意外死亡听想,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門马胧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汉买,“玉大人,你說我怎么就攤上這事漓雅÷急穑” “怎么了朽色?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵邻吞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我葫男,道長(zhǎng)抱冷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任梢褐,我火速辦了婚禮旺遮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盈咳。我一直安慰自己耿眉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布鱼响。 她就那樣靜靜地躺著鸣剪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上筐骇,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天债鸡,我揣著相機(jī)與錄音,去河邊找鬼铛纬。 笑死厌均,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的告唆。 我是一名探鬼主播棺弊,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼悔详!你這毒婦竟也來了镊屎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤茄螃,失蹤者是張志新(化名)和其女友劉穎缝驳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體归苍,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡用狱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拼弃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夏伊。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖吻氧,靈堂內(nèi)的尸體忽然破棺而出溺忧,到底是詐尸還是另有隱情,我是刑警寧澤盯孙,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布鲁森,位于F島的核電站,受9級(jí)特大地震影響振惰,放射性物質(zhì)發(fā)生泄漏歌溉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一骑晶、第九天 我趴在偏房一處隱蔽的房頂上張望痛垛。 院中可真熱鬧,春花似錦桶蛔、人聲如沸匙头。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蹂析。三九已至抖剿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間识窿,已是汗流浹背斩郎。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喻频,地道東北人缩宜。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像甥温,于是被迫代替她去往敵國(guó)和親锻煌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容