描述摘要和加鹽的原理

摘要原理

摘要是一種算法的總稱, 使用這種算法對原始數(shù)據(jù)進(jìn)行運(yùn)算后生成字符串.不同的原始數(shù)據(jù)理論上計(jì)算的結(jié)果是不同的.

這樣達(dá)到的效果是針對原始數(shù)據(jù)生成其獨(dú)一無二的'指紋'.通過對比數(shù)據(jù)的'指紋'可以識別數(shù)據(jù)的真?zhèn)?摘要算法是不可逆的, 即使拿到了這個(gè)指紋, 也無法利用這個(gè)指紋恢復(fù)出原始數(shù)據(jù).因此安全性有一定的保障.

常見的摘要算法有md5, sha1, sha256等.md5和sha1現(xiàn)在已經(jīng)不是安全的摘要算法了.谷歌號稱已經(jīng)可以產(chǎn)生任意"碰撞".碰撞的意思是說不同的原始數(shù)據(jù)有了同樣的運(yùn)算結(jié)果.如果可以產(chǎn)生任意碰撞, 就意味著任意的結(jié)果都可以用另一個(gè)原始數(shù)據(jù)來仿冒, 所以不安全了.

在保存用戶的密碼時(shí),常用的方法是使用摘要算法生成用戶密碼原始數(shù)據(jù)的摘要,在服務(wù)器數(shù)據(jù)庫里面只保存這個(gè)摘要而不是用戶的原始密碼.這樣做的好處是即使數(shù)據(jù)庫被黑客攻破, 被盜的也只是用戶的密碼的摘要而不是原始密碼.安全性有一定的提高.

可即便是這樣做, 安全性的提高也是有限的, 因?yàn)楹芏嘤脩羰褂玫氖呛唵蚊艽a.而這些簡單密碼的"指紋"早已被計(jì)算出來并生成了一個(gè)"指紋庫", 即彩虹表.如果用戶使用了簡單的密碼, 如生日/單詞等, 黑客可以通過比對, 輕易地獲得用戶的原始密碼.

為了解決這個(gè)問題, 進(jìn)一步提高安全性, "加鹽"的操作被應(yīng)用在用戶密碼保存上.

加鹽原理

為了避免用戶的簡單密碼可以被輕易識別, 在生成摘要時(shí), 我們可以加點(diǎn)作料.作料可以是一個(gè)固定的字符串, 也可以是一個(gè)根據(jù)用戶不同的隨機(jī)字符串.如果是后者, 這個(gè)隨機(jī)字符串也需要被存儲在服務(wù)器中.

具體流程

1.用戶輸入密碼
2.服務(wù)接受到密碼后加鹽轉(zhuǎn)成復(fù)雜字符串
3.對這個(gè)字符串使用摘要算法
4.和數(shù)據(jù)庫中存儲結(jié)果比對.

Python實(shí)現(xiàn)

    # 定義函數(shù)將用戶密碼轉(zhuǎn)為加鹽字符串
    @staticmethod
    def salted_password(password, salt='$!@><?>HUI&DWQa`'):
        """$!@><?>HUI&DWQa`"""
        salted = password + salt
        hash = hashlib.sha256(salted.encode('ascii')).hexdigest()
        return hash

    # 用戶登錄時(shí)比對加鹽字符串
    @classmethod
    def login(cls, form):
        salted = cls.salted_password(form['password'])
        u = User.find_by(username=form['username'], password=salted)
        if u is not None:
            result = '登錄成功'
            return u, result
        else:
            result = '用戶名或者密碼錯(cuò)誤'
            return User.guest(), result

    #用戶注冊時(shí)存儲加鹽字符串
    @classmethod
    def register(cls, form):
        valid = len(form['username']) > 2 and len(form['password']) > 2
        if valid:
            form['password'] = cls.salted_password(form['password'])
            u = User.new(form)
            result = '注冊成功<br> <pre>{}</pre>'.format(User.all())
            return u, result
        else:
            result = '用戶名或者密碼長度必須大于2'
            return User.guest(), result
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 30,194評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,621評論 1 32
  • 這里先簡單介紹單向散列函數(shù)、消息摘要和哈希碰撞的的概念 單向散列函數(shù): 將任意長度的信息轉(zhuǎn)換為較短的固定長度的值,...
    坤_7a1e閱讀 3,645評論 0 0
  • 凄冷的三月 文/與你相識 仿佛看見討好三月的桃花 在寂寞里獨(dú)享空虛冷 熱情與執(zhí)著被辜負(fù) 曾經(jīng)的期待正在咳血 那些善...
    與你相識_40fa閱讀 235評論 0 4

友情鏈接更多精彩內(nèi)容