摘要:如果僅僅只是通過直接加密,不安全。所以為了加入靜態鹽和動態鹽加密的長度我設置的位加密的取三位。用來加強短鏈接檢查這里輸出查看下把。存到數據庫和上面的檢查鹽一樣靜態鹽檢查檢查完畢。拿到原始但是這個算法還是有可能會有沖突。
如果僅僅只是通過MD5直接加密,不安全。彩虹表很容易破解。所以為了加入靜態鹽和動態鹽
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的長度我設置的6位. 加密的url取三位。剩下三位分別給靜態鹽1位和動態鹽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; //標記量。用來加強短鏈接檢查.這里輸出查看下 String sig = md5Util(encrypted); String domain = "www.baidu.com/"; String subDomain = "demo/"; String encryptedUrl = domain+subDomain+encrypted; //把 sig ,encryptedUrl ,originalUrl,key。存到數據庫 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"; //靜態鹽檢查 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查詢數據庫。拿到原始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沖突。而且位數越短越可能發生。最好設置6位以上
解決方法:覆蓋數據庫方法或者重新計算
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77380.html
摘要:加密工具模塊提供了加密功能,包括對的哈希加密解密簽名以及驗證功能的一整套封裝。當然也是優缺點的加密相同的字符是結果都是相同的碼,會出現撞庫的風險。 nodejs-crypto 加密工具 crypto 模塊提供了加密功能,包括對 OpenSSL 的哈希、MD5、HMAC、加密、解密、簽名、以及驗證功能的一整套封裝。 crypto 常用的MD5 MD5 是一種不可逆的加密算法,目前是最牢靠...
閱讀 1841·2021-08-19 11:12
閱讀 1418·2021-07-25 21:37
閱讀 980·2019-08-30 14:07
閱讀 1260·2019-08-30 13:12
閱讀 645·2019-08-30 11:00
閱讀 3523·2019-08-29 16:28
閱讀 982·2019-08-29 15:33
閱讀 2960·2019-08-26 13:40