58.4-密碼安全問題和登錄接口實現(xiàn)

機(jī)遇總是有的际长,如果把握不住,不要怨天憂人兴泥,只因自己不夠優(yōu)秀工育;不要把時間當(dāng)垃圾處理,唯有珍惜光陰搓彻,才能提升生命的質(zhì)量如绸!


總結(jié):

  1. 用戶注冊登錄名重復(fù)怎么解決;
  2. 如何對密碼進(jìn)行加密旭贬;
  3. 如果要發(fā)一些數(shù)據(jù)發(fā)送到第三方客戶端怔接,有沒有第三種解決方案jwt(防篡改);

密碼

使用郵箱 + 密碼方式登錄稀轨。
郵箱要求唯一就行了扼脐,但是,密碼如何存儲奋刽?

早期瓦侮,都是明文的密碼存儲。
后來杨名,使用MD5存儲,但是猖毫,目前也不安全台谍,網(wǎng)上有很多MD5的網(wǎng)站,使用反查方式找到密碼吁断。

加鹽趁蕊,使用hash(password + salt)的結(jié)果存入數(shù)據(jù)庫中,就算拿到數(shù)據(jù)庫的密碼反查仔役,也沒有用了掷伙。如果是固定加鹽,還是容易被找到規(guī)律又兵,或者從源碼中泄露任柜。隨機(jī)加鹽卒废,每一次鹽都變,就增加了破解的難度宙地。

暴力破解摔认, 什么密碼都不能保證不被暴力破解, 例如窮舉宅粥。所以要使用慢hash算法参袱, 例如b crypt, 就會讓每一次計算都很慢秽梅, 都是秒級的抹蚀, 這樣窮舉的時間就會很長,為了一個密碼破解的時間在當(dāng)前CPU或者GPU的計算能力下可能需要幾十年以上企垦;

BCrypt

BCrypt加密算法环壤,號稱目前最安全的算法之一
哈希(Hash)是將目標(biāo)文本轉(zhuǎn)換成具有相同長度的、不可逆的雜湊字符串(或叫做消息摘要)竹观,而加密(Encrypt)是將目標(biāo)文本轉(zhuǎn)換成具有不同長度的镐捧、可逆的密文。

pip install bcrypt

哈希算法臭增,32位懂酱,往往被設(shè)計成生成具有相同長度的文本,而加密算法生成的文本長度與明文本身的長度有關(guān)誊抛。哈希算法是不可逆的列牺,而加密算法是可逆的。

從耗時看出拗窃, b crypt加密瞎领、驗證非常耗時, 所以如果窮舉随夸, 非常耗時九默。而且碰巧攻破一個密碼, 由于鹽不一樣宾毒, 還得窮舉另一個驼修;

salt=b'$2b$12$jwBD7mg9stvIPydF2bqoPO'
b'$2b$12$jwBD7mg9stvIPydF2bqoPOod PwW YV vdmZb5uwWuwvlf9iHqNlKSQO'
$是分隔符
$2b$,加密算法
12诈铛, 表示2^12key expansion rounds
這是鹽b'jwBD7mg9stvIPydF2bqoPO'乙各, 22個字符, Base 64
這是密文b'odP wWYVvdmZb5uwWuwvlf9iHqNl KS QO'幢竹, 31個字符耳峦, Base 64
import bcrypt
import datetime

password = b'123456'
# 每次拿到鹽都不一樣
print(1, bcrypt.gensalt())
print(2, bcrypt.gensalt())
salt = bcrypt.gensalt()

# 拿到的鹽相同,計算等到的密文相同
print('=========same salt ==========')
x = bcrypt.hashpw(password, salt)
print(3, x)
x = bcrypt.hashpw(password, salt)
print(4, x)

# 每次拿到的鹽不同焕毫,計算生成的密文也不一樣
print('=========different salt ==========')
x = bcrypt.hashpw(password, bcrypt.gensalt())
print(5, x)
x = bcrypt.hashpw(password, bcrypt.gensalt())
print(6, x)

# 校驗
print(bcrypt.checkpw(password, x), len(x))
print(bcrypt.checkpw(password + b' ', x), len(x))   # 錯誤校驗方法蹲坷;

# 計算時長
start = datetime.datetime.now()
y = bcrypt.hashpw(password, bcrypt.gensalt())
delta = (datetime.datetime.now() - start).total_seconds()
print(10, 'duration={}'.format(delta))


# 檢驗時長
start = datetime.datetime.now()
y = bcrypt.checkpw(password, x)
delta = (datetime.datetime.now() - start).total_seconds()
print(y)
print(11, 'duration={}'.format(delta))
start = datetime.datetime.now()
y = bcrypt.checkpw(b'1', x)
delta = (datetime.datetime.now() -start).total_seconds()
print(y)
print(10, 'duration={}'.format(delta))

注冊代碼 V2

全局變量
項目的settings.py文件實際上就是全局變量的配置文件驶乾。
SECRET_KEY 一個強(qiáng)密碼

from django.http import JsonResponse,HttpRequest,HttpResponseBadRequest
import simplejson,jwt,bcrypt
from .models import User
from django.db.models import Q
from django.conf import settings


def gen_token(user_id):  # 生成令牌;
    key = settings.SECRET_KEY
    return JsonResponse({
        'token':jwt.encode({'user_id':user_id},key,'HS256').decode()
    },status=201)

# register
def reg(request:HttpRequest):
    print(request.body)

    try:
        payload = simplejson.loads(request.body)  # 用戶數(shù)據(jù)Json化 提交冠句;
        print(type(settings))

        email = payload['email']      # 提取內(nèi)容
        query = User.objects.filter(email=email)   # 看email是否已經(jīng)存在轻掩;
        if query.first():  # 查一下: email 如果存在,則return error;
            print('============================')
            return HttpResponseBadRequest('用戶名已存在')

        # 用戶名不存在懦底,繼續(xù)向下唇牧;
        name = payload['name']   #
        password = payload['password']

        user = User()
        user.email = email
        user.name = name
        user.password = bcrypt.hashpw(password.encode(),bcrypt.gensalt())   # 密碼采用bcrypt加密;

        try:
            user.save()    #保存到數(shù)據(jù)庫test,唯一鍵約束
            return gen_token(user.id)   # 保存數(shù)據(jù)后返回一個令牌數(shù)據(jù)回去聚唐;
        # 可以返回user_id status=201(注冊成功 重新登錄) 或者 token(登錄)

        except Exception as e:
            return JsonResponse({'reason':'asdaf'},status=400)
    except Exception as e:
        print(e)
        return HttpResponseBadRequest('參數(shù)錯誤')

def show(request):          # 方法的使用方式各不相同丐重;
    users = User.objects.all()
    print(users.values())# objects
    return JsonResponse({})
# postman---------------------------------------------------------
{
    "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo5fQ._qB1j7cV-TIe5nZY8yO_x0e3xsnPQef-_1SRcQM-3_k"
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杆查,隨后出現(xiàn)的幾起案子扮惦,更是在濱河造成了極大的恐慌,老刑警劉巖亲桦,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崖蜜,死亡現(xiàn)場離奇詭異,居然都是意外死亡客峭,警方通過查閱死者的電腦和手機(jī)豫领,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舔琅,“玉大人等恐,你說我怎么就攤上這事”蛤荆” “怎么了课蔬?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郊尝。 經(jīng)常有香客問我二跋,道長,這世上最難降的妖魔是什么流昏? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任扎即,我火速辦了婚禮,結(jié)果婚禮上横缔,老公的妹妹穿的比我還像新娘铺遂。我一直安慰自己衫哥,他們只是感情好茎刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撤逢,像睡著了一般膛锭。 火紅的嫁衣襯著肌膚如雪粮坞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天初狰,我揣著相機(jī)與錄音莫杈,去河邊找鬼。 笑死奢入,一個胖子當(dāng)著我的面吹牛筝闹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腥光,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼关顷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了武福?” 一聲冷哼從身側(cè)響起议双,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捉片,沒想到半個月后平痰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伍纫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年宗雇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翻斟。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡逾礁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出访惜,到底是詐尸還是另有隱情嘹履,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布债热,位于F島的核電站砾嫉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窒篱。R本人自食惡果不足惜焕刮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望墙杯。 院中可真熱鬧配并,春花似錦、人聲如沸高镐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫉髓。三九已至观腊,卻和暖如春邑闲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梧油。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工苫耸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人儡陨。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓褪子,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骗村。 傳聞我的和親對象是個殘疾皇子褐筛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348