天天看點

為什麼還要記密碼?

前言

良好的習慣是人生産生複利的有力助手。

2020年第八篇文章,繼續今年的flag:每周至少更新一篇文章。

今天的問題來源于内部的一次分享,關于密碼的存儲問題。

在網際網路時代,大家每天接觸的app和網站太多了,注冊賬戶大部分的場景都需要密碼。

密碼的生成和存儲成為了大家日常生活中常見的事情。

很多朋友面對這樣的情況,一部分朋友的選擇是設定和記憶最多三個以内的密碼,太多實在記不住。有時候密碼還設定的非常弱,比如常見的弱密碼 123456,123123等等。另一部分的朋友,則會把每個網站或者app的密碼都分别存到本地,或者同步到雲(網盤或者文檔),用的時候去搜尋和複制。

這樣的密碼生成和存儲方式,從安全和易用角度來說都有一定的問題。

一.密碼生成與存儲安全

1. 多應用相似/相同密碼

密碼制度本身因安全需求而生,但是由于密碼的生成和存儲麻煩,使用者為了省事使用同一套密碼,帶來了“撞庫”這類的風險。各種資料和案例也已經證明,“撞庫”攻擊早已日夜相伴于我們的身邊,已極具規模化和專業化。

“撞庫”按中文的字面意思解讀,就是“碰撞資料庫”的意思,“資料庫”中往往存儲着大量敏感資料,比如我們登入一個網站所需要的使用者名、密碼,再比如手機号、身份證号等個人隐私資訊。撞庫的主要場景是通過已有的賬号密碼清單,通過登陸正常應用的形式,試圖擷取正确的賬号/密碼組合,大白話就是“盜号”。值得注意的是,盜号并不是撞庫攻擊的唯一目的,驗證某個賬号有沒有在一個站點中注冊過也是常見的撞庫目的。

撞庫離我們遠嗎?實際情況如何?事實證明這類例子并不少見。

  • 攜程因出現技術漏洞,導緻個人資訊、銀行卡cw安全碼等資訊洩漏
  • 小米被爆使用者資料洩漏,涉及800萬小米論壇注冊使用者資訊
  • 多家快遞公司被爆網站存在漏洞遭入侵,有1400萬條個人資訊被洩漏
  • 智聯招聘86萬使用者履歷洩漏
  • 東方航空大量使用者訂單洩漏
  • 12306火車訂票網站被人撞庫

随着近年來物聯網裝置的爆炸性增長,導緻人們對資料流量的可見性普遍缺乏,進而大大增加了整體威脅面和公司的漏洞。資料洩露事件不斷增加,導緻撞庫攻擊成為近年來常用的一種入侵辦法。

2. 密碼的存儲

密碼的存儲方式,在前言的說明中,有朋友則會把每個網站或者app的密碼都分别存到本地,或者同步到雲(網盤或者文檔),用的時候去搜尋和複制,這樣也是有問題的。

  • 本地存儲的時候,沒辦法多平台同步,在家或者工作地方都用密碼的時候就會很麻煩,易用性較差。
  • 雲上同步,比如很多網盤和線上文檔工具,都可以用來存儲密碼,也可以多平台同步,但是無論哪個廠商也無法保證自己的資料永遠不會洩露,而且每次使用密碼,都需要打開存儲密碼的應用搜尋查找 感覺很麻煩。

二.使用者側的解決方案

思路

解決密碼生成的安全問題,主要是為了防止撞庫,最好的辦法當然是不同的網站用不同的密碼,而且網站密碼強度要很高,比如密碼中必須要有數字和大小寫字母。

當然這麼多密碼怎麼記?這就涉及密碼的存儲問題,我個人的建議是不要存儲,每次都自動生成,這樣就不用記憶密碼,也不用擔心洩露了。參考 https://github.com/ls0f/pwm 開源項目,給大家提供一下思路:

使用者隻需要記一個salt,也就是密碼生成中的“加鹽”政策,不同網站的密碼按照(salt+domain+account)的拼接生成sha1,其中domain為域名,account為賬戶名,然後取sha1的前面15位生成密碼,然後再固定規則轉換大小寫和數字,滿足網站的強密碼要求。

這種方式,隻要你的salt安全,你的密碼就會安全。

show code

下面給大家提供Python 和js 的實作方式,大家可以把頁面 部署到自己的VPS或者github Page裡,這樣就可以随意生成密碼了。

Python:

def gen_passwd( raw):

        if sys.version_info > (3, 0):
            h = hmac.new(self.key.encode(), raw.encode(), sha1)
            base64 = b64encode(h.digest()).decode()
        else:
            h = hmac.new(self.key, raw, sha1)
            base64 = h.digest().encode("base64")
        _passwd = base64[0: self.passwd_length]
        return _format_passwd(_passwd)

    def _format_passwd(passwd):
        # 格式化密碼,必須包含大小寫和數字
        self.num_str = "0123456789"
        self.low_letters = "abcdefghijklmnopqrstuvwxyz"
        self.upper_letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        passwd = passwd.replace("+", '0')
        passwd = passwd.replace("/", '1')
        list_passwd = list(passwd)

        if re.search(r"[0-9]", passwd) is None:
            list_passwd[-3] = self.num_str[ord(passwd[-3]) % len(self.num_str)]

        if re.search(r"[a-z]", passwd) is None:
            list_passwd[-2] = self.low_letters[ord(passwd[-2]) % len(
                self.low_letters)]

        if re.search(r"[A-Z]", passwd) is None:
            list_passwd[-1] = self.upper_letters[ord(passwd[-1]) % len(
                self.upper_letters)]

        return ''.join(list_passwd)

    gen_passwd("salt+domain+account")

           

javascript:

function gen_passwd(key, raw){
            var shaObj = new jsSHA("SHA-1", "TEXT");
            shaObj.setHMACKey(key, "TEXT");
            shaObj.update(raw);
            var hmac = shaObj.getHMAC("B64");
            console.log(hmac);
            var passwd = hmac.substring(0, 15);
            console.log(passwd);
            passwd = passwd.replace("+", '0');
            passwd = passwd.replace("/", '1');
            console.log(passwd);
            passwd="abcdefg123789123";
            var list_passwd = passwd.split('');
            if (!RegExp("[0-9]").test(passwd)){
            	console.log("[0-9]",passwd[13]);
                list_passwd[13] = "0123456789"[passwd[13].charCodeAt(0) % 10]
                console.log("[0-9]",list_passwd[13]);
            };
            if (!RegExp("[a-z]").test(passwd)){
            	console.log("[a-z]",passwd[14]);
                list_passwd[14] = "abcdefghijklmnopqrstuvwxyz"[passwd[14].charCodeAt(0) % 26]
                 console.log("[a-z]",list_passwd[14]);
            };
            if (!RegExp("[A-Z]").test(passwd)){
            	console.log("[A-Z]",passwd[15]);
                list_passwd[15] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[passwd[15].charCodeAt(0) % 26]
                 console.log("[A-Z]",list_passwd[15]);
            };
            // charCodeAt
            var final_passwd = list_passwd.join('');
            console.log(final_passwd);
            return final_passwd;
        }
           

在部署的頁面上試一下,再也不用每次去記憶,搜尋密碼了。

為什麼還要記密碼?

三.廠商側的解決方案

一句話,不用傳統的賬号密碼登陸體系,手機登陸,二維碼登陸都挺好。

最後

關注公衆号:七夜安全部落格

為什麼還要記密碼?

回複【1】:領取 Python資料分析 教程大禮包

回複【2】:領取 Python Flask 全套教程

回複【3】:領取 某學院 機器學習 教程

回複【4】:領取 爬蟲 教程

回複【5】:領取 編譯原理 教程

回複【6】:領取 滲透測試 教程

回複【7】:領取 人工智能數學基礎 教程

本文章屬于原創作品,歡迎大家轉載分享,禁止修改文章的内容。尊重原創,轉載請注明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/

本文章屬于原創作品,歡迎大家轉載分享,禁止修改文章的内容。尊重原創,轉載請注明來自:七夜的故事 http://www.cnblogs.com/qiyeboy/

繼續閱讀