摘要:如果仅仅只是通过直接加密,不安全。所以为了加入静态盐和动态盐加密的长度我设置的位加密的取三位。用来加强短链接检查这里输出查看下把。存到数据库和上面的检查盐一样静态盐检查检查完毕。拿到原始但是这个算法还是有可能会有冲突。
如果仅仅只是通过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位以上
解决方法:覆盖数据库方法或者重新计算
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77380.html
摘要:加密工具模块提供了加密功能,包括对的哈希加密解密签名以及验证功能的一整套封装。当然也是优缺点的加密相同的字符是结果都是相同的码,会出现撞库的风险。 nodejs-crypto 加密工具 crypto 模块提供了加密功能,包括对 OpenSSL 的哈希、MD5、HMAC、加密、解密、签名、以及验证功能的一整套封装。 crypto 常用的MD5 MD5 是一种不可逆的加密算法,目前是最牢靠...
阅读 1789·2021-08-19 11:12
阅读 1373·2021-07-25 21:37
阅读 946·2019-08-30 14:07
阅读 1240·2019-08-30 13:12
阅读 622·2019-08-30 11:00
阅读 3501·2019-08-29 16:28
阅读 954·2019-08-29 15:33
阅读 2926·2019-08-26 13:40