# 記錄或驗證密碼的方法 > 在資安領域沒有所謂絕對的安全,你只能不斷提高攻擊者的成本 ## 方法一、Encode 就是換個方式表達資料而已,所以一旦被知道是用什麼 encode 安全性就不復存在。 且現在電腦效能很快,所以列出一堆 decode 的結果並不困難。 所以 **不行** 。 --- ## 方法二、Encrypt 因為 server 也要驗證使用者,所以 decrypt 所需的 key 也勢必要存在 server 上, 既然 cracker 連 db access 都拿得到了,拿到 key 也就不是什麼難事。 所以 **不行**。 --- ## 方法三、Hash hash 不可逆,所以感覺好像可行。 但因為現在電腦運算速度很快,且網路上也有很多建好的表(如 [md5hashing](https://md5hashing.net/hash/sha1/1785bf0ed0f6346210af2d64b310a99b4024ce44)) 直接把 hash 值丟進去就可以直接知道原本的字串是什麼,所以一樣 不安全。 --- ## 方法四、Salting (Hash with salt) salt 是建立是建立密碼時隨機產生的值,把 salt 和 hash 過的值都存進 db, ``` # hash 過的值 SHA1("PASSWORD" + "h7.@-]%<#L") ``` 因為 hash 過的值夠長夠亂,所以網路上的表根本也不可能有這個字串,也就是無法查表破解。 但其實,cracker 都拿到 db access 了,自然也就拿得到 salt,所以他可以把每個人的 salt & hash 都用自己的電腦進行計算。 但每個人的 salt 都不一樣,所以每個密碼都要重算一次,這對 cracker 沒有好處。 > 在儲存密碼時至少要加鹽再雜湊,而且隨機產生的 salt 盡量要含有特殊字元 --- ## 方法五、Salting + hash using Bcrypt Bcrypt 是一種慢雜湊方法,可以設定迭代次數。 所以要重新建表就更慢更久更困難,這也就意味著更安全。