1. 程式人生 > >密碼加鹽原理及shiro實現

密碼加鹽原理及shiro實現

看了一段時間各種資料,才算是理解密碼保護中,加鹽的好處及實現方式,總結如下:

1. 密碼在資料庫儲存方式

a. 明文儲存

username

pwd

liukunbendan

liukun

這種情況下,資料庫如果被拖庫,使用者資訊(核心就是使用者名稱/密碼)就直接洩露

b. 加密儲存

username

pwd(sha512)

liukunbendan

(sha512 (liukun))

3afb1e6d5177393678787b96171feccf22aec73c73cf61aed015f804cba9dd2bdb16f2ad9cf8738d4a00302d747cf5861dd820989b2562bb60f97710dc6b06af

這種情況下,黑客拿到資料庫後,課使用暴力窮解破解(或者使用rainbow table彩虹表 來快速匹配hash值)

rainbow table: 黑客根據常用密碼/(其他被盜庫的密碼) 生成hash值,直接查詢

c.  加密+加鹽 儲存

username

pwd(sha512)

salt - 系統隨機產生,每個使用者都不一樣

liukunbendan

(sha512 (liukun) + (123))

b80500a9cae49b336e246e41ffd65ffccd95f198d95065ec814733ecc9e71b72acaaf9300fdd4f53c36bd8b4c73bffbeb39ab9a945147c4d7a0b6f04ddb37b9d

123

這種情況下,黑客需要根據 salt + 常用密碼 ,來針對每個客戶生成rainbow table, 工作量大了N倍 (N=客戶量)

2. shiro實現

我使用的函式如下:

String passwordEncode = new SimpleHash("SHA-512","password","abc",1).toString();

該函式有4個引數: 加密方法(md5, SHA-1, SHA-256, SHA-512 等等),“密碼明文”,"鹽值"  hash次數

實際執行中,後臺會以  hash("abc(salt)"  "password") 的方式計算得出結果

例如,上面函式結果為:

be8795e7a4b2a9d3cd0ab93cfc1d1143dc428ae3f2a8acefa0b565baecf4985a8ad6dd39b755cfad972601de596a3fdb25baf592b552a6b1968d49d3c955c49f

找了一個線上加密解密網址(), 計算明文abcpassword的sha-512雜湊結果如下:

be8795e7a4b2a9d3cd0ab93cfc1d1143dc428ae3f2a8acefa0b565baecf4985a8ad6dd39b755cfad972601de596a3fdb25baf592b552a6b1968d49d3c955c49f

可見他們是一致的

總結:

使用 hash (password + salt) 並不能完全防止黑客盜庫後暴力破解/彩虹表破解 密碼,只是大大 增加了破解成本

網站安全需要和其他措施一起使用: 

Https, password和salt分開儲存 等等

相關推薦

密碼原理shiro實現

看了一段時間各種資料,才算是理解密碼保護中,加鹽的好處及實現方式,總結如下:1. 密碼在資料庫儲存方式a. 明文儲存username pwd liukunbendan liukun 這種情況下,資料庫如果被拖庫,使用者資訊(核心就是使用者名稱/密碼)就直接洩露b. 加密儲

密碼學】維吉尼亞密碼解密原理及其破解演算法Java實現

1. 維吉尼亞密碼方陣 人們在愷撒移位密碼的基礎上擴展出多表密碼,稱為維吉尼亞密碼。該方法最早記錄在吉奧萬·巴蒂斯塔·貝拉索( Giovan Battista Bellaso)於1553年所著的書《吉奧萬·巴蒂斯塔·貝拉索先生的密碼》 第一行代表明文字母

JavaScript動態檢測密碼強度的原理實現

  在註冊賬戶,設定密碼時,會出現密碼強度動態檢測,網上看了一些帖子,大多隻寫了具體的實現過程,而沒有對原理的分析過程。下面著重講一下其原理。 原理分析 通常實現密碼強度動態判斷有兩種方案實現: 正則。但其效率低一點,難度也大一些。 字串,函式和運算子。

springboot thymeleaf和shiro 整合 第三篇 密碼

package com.ruiguang.config;import java.util.UUID;import org.apache.shiro.crypto.hash.SimpleHash;import org.apache.shiro.util.ByteSource;i

淺談密碼SALT原理

是否 get 註冊 我們 隨機 blank ref .com 使用 我們知道,如果直接對密碼進行散列,那麽黑客可以對通過獲得這個密碼散列值,然後通過查散列值字典(例如MD5密碼破解網站),得到某用戶的密碼。   加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是

雙目相機標定以及立體測距原理OpenCV實現

ada eps 左右 flag 並且 length turn iostream 中一 作者:dcrmg 單目相機標定的目標是獲取相機的內參和外參,內參(1/dx,1/dy,Cx,Cy,f)表征了相機的內部結構參數,外參是相機的旋轉矩陣R和平移向量t。內參中dx和d

nodejs進階:密碼:隨機

nod sharp class oms word blog 輸出 arp har demo var crypto = require(‘crypto‘); function getRandomSalt(){ return Math.random().toStri

Vue數據綁定原理簡單實現

fragement observe images als 統一 rst react github上 each 本篇文章中的代碼只是部分片段,完整代碼存放於github上https://github.com/Q-Zhan/simple-vue。 進入正文~實現數據綁定主要是要

常見的查找算法的原理python實現

put arch img 字典 python實現 需要 技術 () one 順序查找 二分查找 練習 一、順序查找 data=[1,3,4,5,6] value=1 def linear_search(data,value): flag=False

php密碼函數

func string 測試 var var_dump 函數 turn pass code 代碼: /* @desc:php密碼加鹽函數 @param pass 原密碼 @param salt 鹽 @return ret 加密後的密碼 */ function passsal

短時傅裏葉變換(Short Time Fourier Transform)原理 Python 實現

src 參考 函數 ade block return 技術 數學公式 def 原理   短時傅裏葉變換(Short Time Fourier Transform, STFT) 是一個用於語音信號處理的通用工具.它定義了一個非常有用的時間和頻率分布類, 其指定了任意信號隨時間

C++智能指針,指針容器原理簡單實現(auto_ptr,scoped_ptr,ptr_vector).

同時 構造對象 pop 所有 main 操作 bject str 運算 目錄 C++智能指針,指針容器原理及簡單實現(auto_ptr,scoped_ptr,ptr_vector). auto_ptr scoped_ptr ptr_vector C++智能指針,指針容器

線程池原理python實現

source 實例 以及 代碼 let range python實現 queue 上界 https://www.cnblogs.com/goodhacker/p/3359985.html 為什麽需要線程池   目前的大多數網絡服務器,包括Web服務器、Email服務器以

密碼

md5 bin tin pass 字符串 ack exceptio cep port import java.security.MessageDigest;import java.util.Random; import com.sun.org.apache.xerces.i

Android中的Apk的加固 原理解析和實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

OpenCV(一)——高斯卷積核原理程式碼實現

貼出getGaussianKernel原始碼 在smooth.cpp中 提示:Gaussian核基於 正態分佈函式設計 μ是均值,σ^2是方差 正態函式(即一維Gaussian卷積核)如下 二維卷積核通過對一維積分得到,並且μ = 0 根據如下原始碼可知

微信公眾號掃碼登陸原理程式碼實現

1.使用者開啟公眾號點選掃碼功能(注意我們用 scancode_waitmsg這種型別即可)  2.使用者掃描了二維碼會給微信傳送資訊,然後微信把資訊以XML格式傳送給我們的伺服器 3.接收資料,並把資料保存於資料庫或者快取,程式碼如下: $wechatObj = new

使用者密碼加密

使用bcrypt   bcrypt是一種跨平臺的檔案加密工具。由它加密的檔案可在所有支援的作業系統和處理器上進行轉移。它的口令必須是8至56個字元,並將在內部被轉化為448位的金鑰。(http://www.atool.org/hash.php) 網站,可以直觀的看一下加密的演算法。 1、用npm

蒙特.卡羅方法求解圓周率近似值原理程式碼實現

原理 對於某些不能精確求解的問題,蒙特.卡羅方法是一種非常巧妙的尋找近似解的方法。 以求解圓周率的問題為例,假設有一個單位圓及其外切正方形,我們往正方形內扔飛鏢,當扔的次數足夠多以後,“落在圓內的次數/落在正方形內的次數”這個比值會無限接近“圓的面積/

大資料教程(8.2)wordcount程式原理程式碼實現/執行

        上一篇部落格分享了mapreduce的程式設計思想,本節博主將帶小夥伴們瞭解wordcount程式的原理和程式碼實現/執行細節。通過本節可以對mapreduce程式有一個大概的認識,其實hadoop中的map、reduce程