摘要:如果僅僅只是通過直接加密,不安全。所以為了加入靜態(tài)鹽和動態(tài)鹽加密的長度我設(shè)置的位加密的取三位。用來加強短鏈接檢查這里輸出查看下把。存到數(shù)據(jù)庫和上面的檢查鹽一樣靜態(tài)鹽檢查檢查完畢。拿到原始但是這個算法還是有可能會有沖突。
如果僅僅只是通過MD5直接加密,不安全。彩虹表很容易破解。所以為了加入靜態(tài)鹽和動態(tài)鹽
public String encreptUrl(String url){ try { byte[] salt = "JKDSPnBKYJ2E7kEg9mYSteK4AXE8ywUB96y8gjDFhfy".getBytes("UTF-8"); String checkSalt = "C2NkXy3ECJn9AcMB976DnBKYJ2E7kEg9mYSte"; MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.reset(); messageDigest.update(salt); byte[] bytes = url.getBytes("UTF-8"); byte[] encryptUrl = messageDigest.digest(bytes); Base64 base64 = new Base64(true); String semiFinishedProducts = new String(base64.encode(encryptUrl)); //加密url的長度我設(shè)置的6位. 加密的url取三位。剩下三位分別給靜態(tài)鹽1位和動態(tài)鹽2位 String urlKey = semiFinishedProducts.substring(0,3); //位置可以在0-32位之間。這里可以選擇位置。但是解密的時候就必須用同樣的位置 String staticSalt = md5Util(urlKey+checkSalt).substring(4,5); String dynaSalt = md5Util(""+UUID.randomUUID()).substring(5,7); String encrypted = urlKey+staticSalt+dynaSalt; //標(biāo)記量。用來加強短鏈接檢查.這里輸出查看下 String sig = md5Util(encrypted); String domain = "www.baidu.com/"; String subDomain = "demo/"; String encryptedUrl = domain+subDomain+encrypted; //把 sig ,encryptedUrl ,originalUrl,key。存到數(shù)據(jù)庫 return encryptedUrl; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } public String getOriginUrl(String encrpetUrl,String sig){ encrpetUrl = encrpetUrl.substring(encrpetUrl.lastIndexOf("/")+1); String key = encrpetUrl.substring(0,3); String staticSalt = encrpetUrl.substring(3,4); //和上面的檢查鹽一樣 String checkSalt = "C2NkXy3ECJn9AcMB976DnBKYJ2E7kEg9mYSte"; //靜態(tài)鹽檢查 String correctStaticSalt = md5Util(key+checkSalt).substring(4,5); if (!staticSalt.equals(correctStaticSalt)){ return "error"; } String correctSig = md5Util(encrpetUrl); if (!sig.equals(correctSig)){ return "error"; } //檢查完畢。 沒問題就通過key查詢數(shù)據(jù)庫。拿到原始url return "true"; } public String md5Util(String semiFinishedProducts){ MessageDigest lDigest = null; try { lDigest = MessageDigest.getInstance("MD5"); lDigest.update(semiFinishedProducts.getBytes()); BigInteger lHashInt = new BigInteger(1, lDigest.digest()); return String.format("%1$032X", lHashInt); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; }
但是這個算法還是有可能會有hash沖突。而且位數(shù)越短越可能發(fā)生。最好設(shè)置6位以上
解決方法:覆蓋數(shù)據(jù)庫方法或者重新計算
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77380.html
摘要:背景介紹相信很多人手機上都收到過一些營銷短信,短信里面有時候會附帶一些網(wǎng)址,如下圖這些網(wǎng)址往往都是非常短,但是當(dāng)我們打開之后,如果你仔細(xì)觀察,中間會有跳轉(zhuǎn),最終瀏覽器地址欄顯示的網(wǎng)址并不是你短信里面看到的網(wǎng)址,這就是短網(wǎng)址原理和應(yīng)用短網(wǎng)1.背景介紹 相信很多人手機上都收到過一些營銷短信,短信里面有時候會附帶一些網(wǎng)址,如下圖 showImg(https://user-gold-cdn.xitu...
摘要:加密工具模塊提供了加密功能,包括對的哈希加密解密簽名以及驗證功能的一整套封裝。當(dāng)然也是優(yōu)缺點的加密相同的字符是結(jié)果都是相同的碼,會出現(xiàn)撞庫的風(fēng)險。 nodejs-crypto 加密工具 crypto 模塊提供了加密功能,包括對 OpenSSL 的哈希、MD5、HMAC、加密、解密、簽名、以及驗證功能的一整套封裝。 crypto 常用的MD5 MD5 是一種不可逆的加密算法,目前是最牢靠...
閱讀 1852·2021-08-19 11:12
閱讀 1426·2021-07-25 21:37
閱讀 990·2019-08-30 14:07
閱讀 1268·2019-08-30 13:12
閱讀 653·2019-08-30 11:00
閱讀 3530·2019-08-29 16:28
閱讀 994·2019-08-29 15:33
閱讀 2969·2019-08-26 13:40