一般網站會將密碼加密後儲存到資料庫里去,那網站管理員有沒有許可權查看用戶的密碼呢?

比如註冊一些論壇什麼的,論壇的管理員能否或有技術手段查看/得到用戶的密碼?
基於以前的一些風聞,用戶資料也是可以買賣的,比如一萬條多少錢一類的,順便在此求證。


本來想評論的,但是由於目標對象是提問者,就添加答案了。Rio說的從技術角度上來講沒有任何問題,但如果單純要回答這個問題,我覺得會有誤導之嫌——請允許我用這個詞。

是的,如果管理員要查你的密碼,他可以做很多手腳,總有辦法拿到。密碼是加密存儲的,但他會知道用的是什麼加密方式,是否可逆,能否碰撞。

可是粗暴地查看總是不行的——這就是我想告訴提問者的,不必過度擔心。版本越新的資料庫,會增加越來越多的安全措施,彌補漏洞,強制地保障系統安全,這就夠把非技術管理員及一般的攻擊者擋在門外了。

CSDN的事件,讓我震驚的既不是被入侵,也不是曾用過明文,而是CSDN的地位配上(2010年才改為加密存儲)的不負責任做法,顯出的巨大反差。可見,對於中小企業、個人網站來說,比起人氣及效益,安全實在是太末節了,以至於他們不被顯著地攻擊一次都不想把任何心思放在這上面。

最後補充一點,有一個行業事實是,泄露並販賣那些用戶信息的,其實絕大多數並不是信息擁有者,而是找到信息擁有著保管不妥善的漏洞從而非法獲取的人。對於信息擁有者來說,用戶信息是事關企業聲譽的、有必要努力去保障安全的重要資產——如果它有聲譽的話。


負責任的網站,即使資料庫的DBA也是無法看到明文密碼的。如果用戶忘記密碼,通常會給用戶返回一個臨時密碼,用戶確認臨時密碼生效後,登錄後再設置自己的密碼。只要涉及到密碼,資料庫中一定採用密文存儲


有。因為不管怎樣,用戶在登陸的時候終究是要輸入明文的密碼,比如 123456,然後這個明文的密碼發送到伺服器端進行驗證。也就是說,只要在驗證密碼的時候插入一個鉤子就可以得到用戶的帳號和明文密碼的組合。為了安全,不要在任何情況下在多個網站使用相同的帳號密碼組合,否則一旦你在一個網站的帳號密碼被泄露,這些信息會波及到你在其他網站,從而造成更大的損失。至於如何管理好那麼多帳號密碼,請移步知乎的這個問題: http://www.zhihu.com/question/19695004

網站拿到明文密碼後,不負責任的網站就直接存資料庫了。這樣的後果顯而易見:一旦資料庫泄露,所有用戶的帳號密碼就公之於眾了,然後拿到這些泄密資料的人就可以用這些組合在其他網站逐個試出可用的帳號,造成連帶的後果。這次泄露了的 CSDN 就是這樣的典型案例。非常不幸的是,存明文密碼的網站不在少數,而且不少是很多所謂的有公信力的大網站。

負責任的網站拿到明文密碼後通常會做不同程度的保護。最常見的手法就是將密碼進行哈希(hash)運算,然後只在資料庫中存哈希後的值。哈希運算是一個單向的過程,即在數學性質上不可能(其實也不是絕對不可能,只是需要的運算量太大從而變得不現實)從哈希值反算出哈希前的明文密碼。比如我設定的登陸密碼明文是 123456,用最常見的 MD5 哈希運算 MD5("123456") 得到 e10adc3949ba59abbe56e057f20f883e 這個哈希值。然後網站把這個哈希值存在資料庫中。下次我登陸的時候我還是輸入 123456 這個明文密碼,網站拿到明文密碼後先進行 MD5 哈希運算,把得到的結果和資料庫中存儲的哈希值進行比對,如果兩個哈希值一致,說明我輸入了正確的明文密碼。

但實際上如果網站只用簡單的哈希運算,比如 MD5、SHA1 等快速哈希函數,也是不安全的,因為在現在的計算機硬體條件上簡單的哈希保護機制會被多種方法破解。比如最簡單高效的彩虹表攻擊,所以網站還需要把哈希過程弄得更加複雜一點。彩虹表攻擊的原理和防護機制詳見知乎的這個問題: http://www.zhihu.com/question/19790488

更加安全的保護機制是客戶端不向網站發送明文密碼,而是採用比如公開密鑰等非對稱加密方式。但在大規模部署的時候很難向那麼多小白用戶解釋清楚這樣複雜的加密機制的工作原理,所以實踐中一般只有管理員登陸伺服器這樣的高危行為才會採用非對稱加密,而面向公眾的網站頁面登陸還是採用簡單對稱密碼。當然業界也在為了解決這個難題而努力,比如一直被寄予厚望的 OpenID 和最近 Mozilla 開始推的 BroswerID。只是這些替代方案解釋起來還是很不容易,能否普及起來、什麼時候普及起來還不清楚。

最後,在這個世界變得完全美好之前,容我再啰嗦一遍:為了安全,不要在任何情況下在多個網站使用相同的帳號密碼組合,否則一旦你在一個網站的帳號密碼被泄露,這些信息會波及到你在其他網站,從而造成更大的損失。如何管理好那麼多帳號密碼,請移步知乎的這個問題: http://www.zhihu.com/question/19695004


管理員可以看到密碼,但是都是加密後的密文,現在應該沒什麼人用明文存密碼了。所以管理員看到你密文密碼後也只能靠暴力破解才能知道你真正的密碼。


感覺這裡的回答有一點偏題了。這個問題是管理員是否能夠有許可權查看用戶的密碼,但是回答里主要闡述了明文傳輸、Hash函數、公私鑰加密等方法。請注意,這些方法更多的是防止傳輸過程中被竊聽,但是最終資料庫中會存一個值Value,登錄過程中會有一個邏輯將用戶輸入的值Value『進行轉換。假設這個轉化函數為f(Value"),最終如果Value=f(Value")則登陸成功,反之失敗。

我們一點一點來探討一下如何增強程序的邏輯來防止管理員通過查看用戶資料庫里密碼的值來通過正常的程序登陸相應用戶賬號的方法:(管理員通過後台繞過程序的登陸過程之間訪問用戶賬號不在技術的討論範圍內。)

  • 明文存儲

明文存儲顯然是不靠譜的,管理員可以通過查看到的密碼直接登陸用戶賬號。

  • 存儲實際密碼的哈希函數

資料庫中只需存儲實際密碼的哈希函數,這個哈希函數可以是MD5、SHA1等,這樣的情況下管理員無法直接獲得用戶的密碼用來登陸相應的賬號。正如@Rio 提到,這種方法可能會遭到彩虹表攻擊。更加危險的是,對於管理員來講如果他擁有對資料庫的修改許可權,那麼他將有一種更加簡單的攻擊方式。

  1. 自己註冊一個賬號A與密碼P。
  2. 在資料庫中查詢自己的賬號的密碼的哈希值Hash(P)。
  3. 將要攻擊的賬號A"的密碼的哈希值Hash(P")修改成自己賬號的哈希值Hash(P)。
  4. 利用要攻擊的賬號A"與自己的密碼的哈希值Hash(P)從正常程序入口登錄進行攻擊。
  5. 攻擊結束將要攻擊的賬號A"的密碼的哈希值改回Hash(P")。
  • 存儲賬號+密碼的哈希函數

為了防止上述的攻擊方式,即跨賬號的攻擊。我們在資料庫中存儲的是賬號+密碼的哈希函數,這樣的好處是管理員無法通過已有的其他賬號來推測某些賬號的密碼。同時,彩虹表攻擊的難度也增加了。為了攻擊賬號A,攻擊者需要針對A來建立一個彩虹表;而這個彩虹表無法被應用去攻擊賬號B。

  • 存儲域名+賬號+密碼的哈希函數

上述方法解決的是跨賬號的攻擊問題,以此類推。用戶在不同域名中的賬號與密碼可能有關聯,因此利用了域名+賬號+密碼的哈希函數可以防止此類跨域攻擊。


一般情況下 DBA 只能夠查看到加密後的密碼。不一定知道加密演算法。所以很難對密碼進行破解。
其實更加可能盜用密碼的是程序員!他們知道演算法,也能夠通過資料庫或者程序知道你們的加密密碼就可以進行破解。升至留下後門收集密碼!
最後 如果你不信任一個網站 你就順便設置一個密碼(非你的常用密碼)。


你請不起做網路安全的人我也就忍了,你最起碼把我的密碼MD5一下嘛....


首先要明白儲存數據是使用資料庫來儲存了。(維基百科是用的文件的形式)
假設現在是一個博客系統:那麼你所發表的文章與用戶信息都需要使用資料庫來儲存。
資料庫的儲存是不分密碼與文章的,不會因為密碼重要就安全性就高,資料庫只是儲存數據。
那麼既然文章可以讀取出來,同樣的密碼也是可以讀取出來的。

所以管理員只要擁有資料庫許可權就是可以查看所有的數據


沒有,如果是在題主題目所述的前提條件下(將密碼加密後儲存到資料庫里去)。
而Rio說的在驗證密碼的時候插入鉤子,並不屬於把密碼加密後儲存,這樣網站安全風險較大一般也不會有站長去做。另外想要獲得不加密的密碼儲存也需要在登陸頁面插入類似以下的代碼(以PHP為例)然後等用戶再次登陸,並無法直接解密密文(指的使用不可逆加密演算法的情況,使用凱撒密碼加密的肯定是可以輕易還原的,不過用凱撒密碼加密可真是一件奇怪的事啊。)

if(登陸條件成立){
$handle = fopen("user.txt", "a+");
fwrite($handle, date("Y-m-d")."|".$user."|".$password."
");
fclose($handle);
}

一般註冊一些論壇,如果在不修改LoginPage的情況下,論壇管理員也不會有許可權看到密碼的,只能從資料庫看到加密後的密文。以比較常見的Discuz!論壇程序為例,其加密方法也不是常見的普通MD5加密,而是MD5(MD5+salt)(叫法隨意)。
簡單說下MD5(MD5+salt)加密演算法,用php函數表示就是md5(md5($password).$salt),$salt是一個六位隨機數字,這樣一來,123456加密後會變成什麼呢?

1、生成隨機數$salt=179243,最終會和加密後的密文一同入庫。
2、MD5(123456)=e10adc3949ba59abbe56e057f20f883e
3、加 salt,變成e10adc3949ba59abbe56e057f20f883e179243
4、再次加密,最終密文Password=MD5(e10adc3949ba59abbe56e057f20f883e179243)=214d626bcdc53bae2997cc927fe34d71

這樣的加密方法我個人認為目前已經不可能通過彩虹表爆出,如果要爆出這樣的10位數字母+數字的密碼,彩虹表需要的數據量大家可以計算一下。

題外話就不說了,最後解答題主最後一問:「基於以前的一些風聞,用戶資料也是可以買賣的,比如一萬條多少錢一類的,順便在此求證。」
確實是可以買賣的,一般買賣的是電子郵箱地址(少數網站會要求會員等登記手機號碼數據,這些更值錢)之類的聯繫方式,買來用來發垃圾郵件的。從一些網站購買電子郵箱地址,優點是針對性強,比如你想推銷一些數碼產品,那麼你可以主動聯繫一些數碼網站的站長收購郵箱地址,這樣用了發垃圾郵件推銷產品成功率就比你窮舉QQ郵箱地址那樣發要高得多。出售價格一般波動比較大,是看用戶價值,像一些車友網站,會員的聯繫方式肯定要比李毅粉絲站的值錢。
如果題主比較擔心自己郵箱地址泄露,可以使用Gmail的別名功能,比如你的Gmail地址是XXX@ http://Gmail.com,當你註冊知乎的時候你可以填寫XXX+zhihu@ http://gmail.com,這樣註冊過後如果知乎把你郵箱地址(XXX+zhihu@ http://gmail.com)賣了,別人發廣告到你的郵箱地址XXX+zhihu@ http://gmail.com,你就可以知道知乎把你郵箱地址賣了。(蛤蛤不過要是被知道就不靈了,一個正則過濾就可以把這些全部清理乾淨)


1.增加一點語句就可以直接把register到的用戶和密碼明文存入庫中。
2.直接用彩虹表來跑。O(∩_∩)O哈哈~


一般情況下密碼會經過加密然後放倒資料庫裡面
一般這一過程使用不可逆的演算法 比如你的密碼是123 加密後是awd
管理員可以看到awd,但是無法還原出來123
要正式從登陸界面登陸需要的是123 所以這樣是沒用的

不過如果他在加密之前就獲取密碼的話就可以了


通過md5等哈希演算法加密後放到資料庫本身是安全的,因為從理論上這些加密後的數據是不可逆的,也就是說管理員並不知道你的明文密碼。
但是目前通過彩虹表和md5碰撞庫的方法,可以快速破解大量弱密碼,這樣就要求用戶提高自身的密碼強度,並且在不同的網站採用不同的密碼和密碼方式(防止通過密碼心理學和社工進行爆破)。
而在伺服器端採用動態salt的方式對密碼進行加密,也可以有效防止彩虹表的攻擊。
請記住對密碼進行加密一定要採用hash,也就是不可逆,而不是單純的加密演算法。


通常資料庫是不保存明文密碼的,也就是說會對明文密碼進行一系列不可逆的運算再進行保存,每次用戶登陸時候重新進行這個運算來驗證,所以管理員就是看到了也「沒用」。

關於CSDN,我就不理解了,保存明文密碼這得是多麼二的事情啊。


一般類的網站會使用密文存儲,理論上管理員看不到明文密碼。至於加密水平,各網站參差不齊吧!曾經試圖截獲同網路某隻的fb cookie,然後順利拿下 fb password -1 minute~


還有一種方式,即拋棄用戶名和密碼的驗證機制,直接使用數字證書進行驗證。而數字證書存儲在特指的智能卡中(也叫UKey),無法被複制,證卡本身也具有密碼保護,這樣就可以實現更高的安全性了。
不過使用數字證書的話,需要再客戶端電腦上安裝軟體配置一些東西,對於普通用戶來說會有一些困難。不過,安全和方便總是矛盾的嘛。


可以查看 也可以被保存 別懷疑 幾句代碼的問題 只要有管理許可權 管理員不會那麼笨 去破解你的加密密碼,他會直接得到你明文密碼


可以看見,不過不是明文密碼,而是加過密的,要通過解密才可以看到


但凡有點節操的網站存貯密碼肯定是加密後密文,且不可逆,比如md5。dba看到密文也沒轍。


有節操的網站的資料庫存的都是加密之後的密文。
加密過程是不可逆的。
網站登錄驗證過程是把用戶輸入的密碼同樣走一遍加密過程看看跟密文是否一致,而不是直接對比輸入密碼和註冊密碼。
管理員即使是直接查看資料庫也是沒辦法看到原文的。
當然要說特殊情況,密文在有些時候可以還原成原文,要看密碼強度和加密強度。
比如最簡單的MD5演算法配合6位以下密碼的話...隨便找個MD5庫都能查出來


曾經有一次被要求必須明文保存用戶密碼,後來有人查詢用戶資料就直接問我們要用戶密碼。


推薦閱讀:

MD5 是不是可以這樣破解?
密碼安全問題有多雞肋?
哪位大神能破解這廣告上的密碼?
古代是怎麼做到讓傳遞的信息保密的呢?
為什麼銀行還在使用六位數字取款密碼?

TAG:資料庫 | 網路安全 | 網站運營 | 網站 | 隱私 | 用戶隱私 | 生活常識 | 密碼 |