IT技術互動交流平台

打造一個安全的用戶名密碼登陸係統

作者__|青橙青云:佚名  發布日期|_易旺彩票网下载:2016-08-02 21:13:26

 撰寫於 2016年8月1日 修改於 2016年8月2日 分類編程雜記 標簽AngularJS /Express /Node.js /Waterline /安全

很多的網絡應用都有基於用戶名密碼的登陸功能|易拍宝,而絕大多數的登陸都毫無安全性可言||_跆拳道太子妃,不誇張的說|-168彩票靠谱,大多數的程序員根本不知道怎樣去保證用戶名和密碼的安全_--净留香。

安全的標準

要想一個登陸係統安全_|-莓文化,至少要保證以下幾個方麵_|_吴尊的qq号是多少 要真的。

原始密碼的安全

很多人對於用戶的原始密碼安全-|-移动彩票官11086,還停留在不被非法第三方獲取的層麵上___金玫瑰洞下载,但實際上_-于宏洁2013年讲道集,原始密碼的最大威脅--小米联通合约机套餐,往往來自於係統的開發人員和服務器的管理人員|||至诚健身中心。這些人可能是有意收集||-至尊娱乐购彩平台,也可能是無意泄露_|-航空证券保定营业部,往往是用戶原始密碼的泄露的罪魁禍首-|地耳菜。在構建登陸係統的時候|_花果园业主论坛,應該從根本上避免___0898是哪里的区号,做到隻有用戶自己和鍵盤記錄器才知道原始密碼|维护人员工具。

那如何做到這一點呢--麦当网?首先一點就是一定要在客戶端進行密碼加密_-讫,這可以使得後端拿到的密碼已經是加過密的||后来的歌词,一來服務器接觸不到原始密碼|货车司机罢运最新动态,二來就算通信被監聽---斗战神宇文公在哪里,第三方就算拿到了可以用來登陸的客戶端加密密文--_自行车的污染比汽车更大,也無法獲知用戶的原始密碼盈彩在线注册。

哈希_反间谍工作的主管单位:不可逆加密

密碼加密不同於普通的加密__-黄河电视台直播,一是內容重要_永胜彩票网正规吗?,二是密碼的驗證根本不需要原文|长沙王府井影城,要檢查一個密碼是否正確-_宝安教育在线基础教育,隻需要看它加密的結果與正確的密碼加密的結果是否一致即可|-|淘宝开店步骤费用。確定了這兩點_|临江市邮编,對於加密的方法_|-淘宝试用中心是真的吗,就隻要求同一個字符串加密後會得到同樣的密文-_-御泥坊创始人36岁猝死。哈希完全滿足了這一要求_-_28彩官方下载。

在哈希算法中|宜宾大恒影院,首選是 SHA2 係列|_-魏征进谏图,雖然安全由於 SHA1 的原因而被質疑--_北京466耳鼻咽喉医院,但至少目前還沒有證明有什麼紕漏-_奇迹世界2狂战士加点。MD5 由於用得太多-|htcg13报价,而且彩虹表實在過於泛濫|_|k7k7k小游戏,並不推薦使用||云顶娱乐手机官网苹果。

另外一個問題-_|异界之骨灰级玩家,哈希一遍是不是就夠了呢-|仙剑5破解?當然不-让我取暖歌词,不僅要多次哈希|一段话日记,而且還要與用戶名一類的數據混加_|梦回大唐之萧瑟流光,比如|-_中视购物网,可以使用下麵的方式來在客戶端加密原始密碼|-_单路遥控开关:

sha256(
  sha265(sha265(password)) + sha265(username)
)

這樣|_-许喵喵mickey,不僅可以增加密文反推原文的難度|-谢园的学生,還加入用戶名|_111彩票漏洞,使得就算密碼相同_长春花卉批发,不同用戶的密文也完全不一樣-||利爪之王艾吉斯。

在客戶端的加密|-|盈彩注册邀请码,基本上也就隻能到這一步了-_亿彩卸载了怎么办,因為一個最主要的問題是|166cp彩票,客戶端的加密算法是公開的--东三省二模。

鹽|-_银色黎明声望:混入隨機數據

雖然在客戶端對密碼進行了加密_||001官方彩票,但無論是算法_2018白菜注册网,還是混入的用戶名|_青岛大哥骂雅阁女,都是公開了的_|奶妈吧。剩下的加密_-珂黛丽,就需要留給後端了_|-塞班5800论坛。

由於對同一字符串進行哈希的結果是恒定的--亿发彩票安不安全,所以知道了算法和密文_|-美国高菲特,理論上是可以反推出密碼的|_160彩票网是正规的吗,反推的難度取決於用戶原始密碼的複雜度-__金钟大赛。那如何才能夠讓反推的難度指數級增大呢--项目投资计划书范文?答案是在原始密碼密文的基礎之上-_|移动彩票首页,再加入一個隨機字符串|-五个人出名了,從而達到讓用戶的密碼更複雜的效果--湖南台最近的电视剧。這個隨機字符串-|实名注册和防沉迷系统,便是鹽-__19手机网。

後端獲取到客戶端傳來的密碼之後-_|黄山电大在线,再通過加鹽哈希進行再加密-|曼联正品球衣。比如像下麵這樣-_|掌上彩票pro无法联网了:

sha256(
  sha256(username + sha256(password + salt)) + salt + sha256(username + salt)
)

注意|-敕令大将军到此,鹽的保存非常關鍵-_|亿发国际官网ibb,務必將它與用戶信息分開存放|--希伯雅。

密文和鹽的更新與不可追溯

現在密碼已經分別在客戶端和後端多次哈希|_-花生油会凝固吗,還加了鹽__|10元可提现的彩票平台,好像已經很安全了|-|铜镜反应。但其實_跆拳道太子妃,我們還可以更安全_|_掌上彩票专业投注版。那就是經常變更鹽||邯郸晚报电子版,讓用戶信息表中的密文字段值也經常變化--_青白江攀成钢。這樣-_美生美时,除非同時拿到用戶信息和鹽|-阿皮亚古道,否則依然無效_--银监会待遇。

那什麼時候變更鹽和密文呢-qq刷q币软件免费版?由於後端是不存儲客戶端哈希的密文的---菲亚斯,所以隻有在登陸的時候-_0k000澳客彩票电脑,才能夠進行鹽和密文的修改_五星体育f1。

用戶名本身可以加密嗎-快乐大本营棒棒堂?

這個想法好像有點不靠譜__-小学生蜡笔画,但實際上||360全国彩票开奖号码,用戶名如果隻是作為單純的登陸憑證||敕令大将军到此,其實是可以像密碼一樣加密的_-重生之凤求凰。因為無論是注冊-_日本大地震电影、登陸還是找回密碼-|_亿发彩票犯法吗,都不需要用戶名的原文|-盈彩在线app是不是真的。但注意_|-讫,用戶名隻能哈希_|陈公博,不能加鹽|中兴彩票ApP,否則就沒什麼依據去找鹽了_-_天津apec限行规定。

用戶名的哈希可以分兩部分|cf卡墙教程,一是客戶端哈希__未成年身份证号码,到了服務器端__高清主题,可以進行再次哈希_||宅男躲艳记。

在本文的 Demo 中||爱划算,將不對用戶名哈希_|尿毒症武警二院专家。

通信的安全

在應用層麵基本上已經很安全了|_南京长江骨科医院。接下來就是客戶端和通信的安全-_长沙杨丽君。客戶端的環境基本不可控|-2929美高梅,所以隻能在通信的安全上想辦法了-_比波网。不過其實也不用想什麼多的辦法--_张铁泉为何孤身一人,直接使用 HTTPS 就行了_-尺道。

登陸流程

上麵總結了怎樣保證一個用戶名密碼登陸係統的安全|234彩票平台怎么样,這裏再來看看一個滿足上述要求的登陸係統的登陸流程|_幼香阁网址。注冊流程相對來講簡單一些-|再见美丽女孩,所以就不再詳細介紹|__丝图腾。

Demo 是一個簡單的 Web 用戶名密碼登陸係統-_易彩属违法行为吗,代碼示例也取自於它_|-168彩票被风控了怎么办。

瀏覽器登陸

瀏覽器主要完成以下工作-__舞龙舞狮的由来:

獲取用戶輸入的用戶名及密碼 通過輸入的用戶名和密碼|-_铁纹,進行哈希|计提职工福利费,得到瀏覽器端密文 將用戶名和密文提交給後端

主要代碼如下|联想a60手机游戏,取自 client/app.js _校园协奏曲:

// 密碼與用戶名的哈希
function encryptPwd(username, password) {
  username = username.toLowerCase();
  return sha256(
    username + sha256 (
      sha256(sha256(sha256(password))) + sha256(username)
    )
  );
}

$scope.login = function(){
  // 檢查用戶名和密碼的合法性|-剑灵李素梅,比如是否輸入|-安卓鬼魂探测器,長度是否足夠等
  if($scope.check()) {
    return;
  }
  $scope.successMessage = '';
  $scope.errorMessage = '';
  $scope.status = 'loading';
  // 向後端提交登陸請求
  $resource('/user/login')
  .save({
    username: $scope.username,
    password: encryptPwd($scope.username, $scope.password)
  }, function(res){
    $scope.status = 'done';
    $scope.successMessage = 'login successful!';
  }, function(reason){
    $scope.status = 'done';
    $scope.errorMessage = reason.data || 'failed';
  });
};

後端密碼驗證

後端的驗證流程如下|-金立x805参数:

獲取前端提交的用戶名及瀏覽器端密文 根據用戶名_|-长治县段小青,在數據庫中查詢出對應的鹽 id 通過鹽 id 取出對應的鹽||105彩票官网版,再通過用戶名_|2019六香港145期、瀏覽器端密文和鹽算出後端密文 根據用戶名和後端密文到用戶表查詢-qq游戏2011官方下载正式版免费下载,如果有結果_-125摩托车改装,則表明登陸信息正確|-舞龙的意义,返回給瀏覽器登陸成功的響應 生成新的鹽_请定位lame exe,算出新的後端密文_||众发彩票代打兼职,並將兩者更新到數據庫中

 

實現的代碼如下|青苹果家园论坛,取自 app/controllers/user.server.controller.js -|-256老彩票:

function encryptPwd(usr, pwd, salt){
  usr = usr.toLowerCase();
  return sha256(
    sha256(usr + sha256(pwd + salt)) + salt + sha256(usr + salt)
  )
}

function login(req, res, next){
  // 用戶名密碼獲取和檢查已省略
  // 根據用戶名_-|bl文h,獲取鹽 id
  req.models.user
  .findOne({select:['username', 'saltId'], where: {username: username}})
  .exec(function(err, userDoc){
    if(err) return next(err);
    if(!userDoc) return next(new Error('username not exists'));

    // 取鹽
    req.models.salt
    .findOne({id: userDoc.saltId})
    .exec(function(err, saltDoc){
      if(err) return next(err);
      if(!saltDoc) return next(new Error('can NOT find salt'));

      // 根據用戶名|11选5开奖号码、密碼和鹽推算出密文
      var pwdHash = encryptPwd(username, password, saltDoc.salt);
      // 在數據庫中核對用戶名和密文
      req.models.user
      .findOne({select: ['id'], where: {username: username, password: pwdHash }})
      .exec(function(err, doc){
        if(err) return next(err);
        if(!doc) return next(new Error('password error'));

        res.json({
          username: username
        });

        return updateSalt(saltDoc, userDoc, password, next);
      });
    });
  });
}

鹽與密文的更新

前麵返回給用戶成功登陸的響應之後|_-陈国栋的秘书,調用了更新鹽和密文的方法_各种扣子,該方法具體流程如下__|oppo801:

生成並存儲新鹽 根據新鹽-|快乐女声报名、用戶名和瀏覽器端密文--_盈众彩票平台安全吗,生成新的後端密文 存儲後端密文到用戶信息表

實現如下||赢彩彩票账号怎么注销,取自 app/controllers/user.server.controller.js |_中博彩票网:

function updateSalt(saltDoc, userDoc, passwordInputed, next){
  saltDoc.salt = Math.random().toString(15).substr(3, 27);
  saltDoc.save(function(err){
    if(err) return next(err);
    userDoc.password = encryptPwd(userDoc.username, passwordInputed, saltDoc.salt);
    userDoc.save(function(err){
      if(err) return next(err);
      return next();
    });
  });
}

Demo

Demo 托管在 Github 上-||106官网彩票平台苹果机。前端采用 AngularJS + Bootstrap -_|云顶国际在线赌场,後端使用 Node.js + Express + MongoDB __-青年汇佳园,是一個典型的 MEAN 應用 _|西宁特产。

數據存儲這塊--_剧场版奥特曼,使用了 Waterline 這個 ORM 中間件(以前也曾經寫過兩篇介紹文章_|清东陵地宫,可供參考-_诺基亚6120c软件下载: Node.js ORM 數據操作中間件 Waterline _|_威海卫生365、 在 Express 項目中使用 Waterline )_|优衣库视频事件。使用它的目的主要是為了將用戶信息和鹽存儲到不同的地方_|htc a3333。本例中將鹽用 sails-disk 存儲到了文件中_|-2013重庆高考作文题目,用戶信息用 sails-mongo 存儲到了 MongoDB 中|--班主任德育论文题目。

git clone https://github.com/stiekel/safe-username-password-login.git
cd safe-username-password-login
npm i
npm i -g gulp
gulp

再在瀏覽器中打開 http://localhost:7102/ 即可|--河南省实验中学分校。

 

延伸閱讀_-苏州红星美凯龙招聘:

Tag標簽-重庆ume官网: 用戶名   密碼   係統  
  • 專題推薦

  • Windows7係統入門 優化 技巧技術專題
  • Windows7係統專題 無論是升級操作係統_|xiannuhu、資料備份-|百度在线朗读器、加強資料的安全及管...... 詳細
About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯係方式
本站內容來自於互聯網,僅供用於網絡技術學習,學習中請遵循相關法律法規
E乐彩天盛彩票K8彩票pc蛋蛋旺旺彩票永城彩票

免责声明: 本站资料及图片来源互联网文章,本网不承担任何由内容信息所引起的争议和法律责任。所有作品版权归原创作者所有,与本站立场无关,如用户分享不慎侵犯了您的权益,请联系我们告知,我们将做删除处理!