第1.9題:Python對(duì)密碼加密

題目來自:Python 練習(xí)冊(cè)題目1.9: 通常递鹉,登陸某個(gè)網(wǎng)站或者 APP盟步,需要使用用戶名和密碼。密碼是如何加密后存儲(chǔ)起來的呢躏结?請(qǐng)使用 Python 對(duì)密碼加密却盘。

查看更多于本人博客:iii.run


思路:salt 加 hash 來單向轉(zhuǎn)換密碼明文

參考代碼

以下給出Py2和Py3兩段代碼,輸出的內(nèi)容是一樣的。因?yàn)榧用苤蟮膬?nèi)容不是unicode代碼谷炸,所以存儲(chǔ)可能不方便北专,可以使用base64.b64encode(hashed)轉(zhuǎn)化為base64編碼格式。

輸出結(jié)果

Python2代碼

import os,base64
from hashlib import sha256
from hmac import HMAC

def encrypt_password(password, salt=None):
    """Hash password on the fly."""
    if salt is None:
        salt = os.urandom(8) # 64 bits.

    assert 8 == len(salt)
    assert isinstance(salt, str)

    if isinstance(password, unicode):
        password = password.encode('UTF-8')

    assert isinstance(password, str)

    result = password
    for i in xrange(10):
        result = HMAC(result, salt, sha256).digest()

    return salt + result

def validate_password(hashed, input_password):
    return hashed == encrypt_password(input_password, salt=hashed[:8])
    

if __name__=="__main__":
    hashed = encrypt_password('secret password')
    assert validate_password(hashed, 'secret password')
    print (hashed)
    print (base64.b64encode(hashed))
    print (base64.b64decode(base64.b64encode(hashed)))

Python3代碼

import os, base64
from hashlib import sha256
from hmac import HMAC


def encrypt_password(password, salt=None):
    """Hash password on the fly."""
    if salt is None:
        salt = os.urandom(8)  # 64 bits.

    assert 8 == len(salt)
    assert isinstance(salt, bytes)
    assert isinstance(password, str)
    
    if isinstance(password, str):
        password = password.encode('UTF-8')

    assert isinstance(password, bytes)

    result = password
    for i in range(10):
        result = HMAC(result, salt, sha256).digest()

    return salt + result


def validate_password(hashed, input_password):
    return hashed == encrypt_password(input_password, salt=hashed[:8])


if __name__ == "__main__":
    hashed = encrypt_password('secret password')
    assert validate_password(hashed, 'secret password')
    print (hashed)
    print (base64.b64encode(hashed))
    print (base64.b64decode(base64.b64encode(hashed)))

Python編碼問題

一開始直接在Python3環(huán)境運(yùn)行第一段代碼的時(shí)候旬陡,總會(huì)報(bào)錯(cuò)NameError: global name 'unicode' is not defined拓颓,百思不得其解。

查了資料描孟,才發(fā)現(xiàn)是因?yàn)镻ython更新的時(shí)候驶睦,Python 3 renamed the unicode type to str, the old str type has been replaced by bytes。在Python升級(jí)文檔內(nèi)可以查到相關(guān)內(nèi)容匿醒,也就是unicode直接改名str场航,str改名成bytes
Python2和Python3廉羔,在編碼方面挖下太多的坑
舉個(gè)簡(jiǎn)單的例子:

isinstance(u'中文', unicode) #python2內(nèi)是正確的
isinstance(u'中文', str) #python3內(nèi)是正確的

Python3內(nèi)的unicode和bytes

Python 3最重要的新特性大概要算是對(duì)文本和二進(jìn)制數(shù)據(jù)作了更為清晰的區(qū)分溉痢。文本總是Unicode,由str類型表示憋他,二進(jìn)制數(shù)據(jù)則由bytes類型表示孩饼。

在將字符串存入磁盤和從磁盤讀取字符串的過程中,Python 自動(dòng)地幫你完成了編碼和解碼的工作竹挡,你不需要關(guān)心它的過程镀娶,例如你能把一個(gè)中文賦值給字符串。而使用 bytes 類型揪罕,實(shí)質(zhì)上是告訴 Python梯码,不需要它幫你自動(dòng)地完成編碼和解碼的工作,而是用戶自己手動(dòng)進(jìn)行好啰,并指定編碼格式轩娶。


參考鏈接:
http://zhuoqiang.me/password-storage-and-python-example.html
http://www.ituring.com.cn/article/61192

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坎怪,隨后出現(xiàn)的幾起案子罢坝,更是在濱河造成了極大的恐慌,老刑警劉巖搅窿,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘁酿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡男应,警方通過查閱死者的電腦和手機(jī)闹司,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沐飘,“玉大人游桩,你說我怎么就攤上這事牲迫。” “怎么了借卧?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵盹憎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我铐刘,道長(zhǎng)陪每,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任镰吵,我火速辦了婚禮檩禾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疤祭。我一直安慰自己盼产,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布勺馆。 她就那樣靜靜地躺著戏售,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谓传。 梳的紋絲不亂的頭發(fā)上蜈项,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音续挟,去河邊找鬼。 笑死侥衬,一個(gè)胖子當(dāng)著我的面吹牛诗祸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轴总,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼直颅,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了怀樟?” 一聲冷哼從身側(cè)響起功偿,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎往堡,沒想到半個(gè)月后械荷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虑灰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年吨瞎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穆咐。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颤诀,死狀恐怖字旭,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崖叫,我是刑警寧澤遗淳,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站心傀,受9級(jí)特大地震影響屈暗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剧包,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一恐锦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疆液,春花似錦一铅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至掉缺,卻和暖如春卜录,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背眶明。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國打工艰毒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搜囱。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓丑瞧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親蜀肘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绊汹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

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