资讯专栏INFORMATION COLUMN

短链接算法实现--加盐hash

ssshooter / 2691人阅读

摘要:如果仅仅只是通过直接加密,不安全。所以为了加入静态盐和动态盐加密的长度我设置的位加密的取三位。用来加强短链接检查这里输出查看下把。存到数据库和上面的检查盐一样静态盐检查检查完毕。拿到原始但是这个算法还是有可能会有冲突。

如果仅仅只是通过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

相关文章

  • 网址原理和实现

    摘要:背景介绍相信很多人手机上都收到过一些营销短信,短信里面有时候会附带一些网址,如下图这些网址往往都是非常短,但是当我们打开之后,如果你仔细观察,中间会有跳转,最终浏览器地址栏显示的网址并不是你短信里面看到的网址,这就是短网址原理和应用短网1.背景介绍 相信很多人手机上都收到过一些营销短信,短信里面有时候会附带一些网址,如下图 showImg(https://user-gold-cdn.xitu...

    sihai 评论0 收藏0
  • 漫话密码存储

    摘要:通俗一点说就是彩虹表牺牲了一点计算速度,换来的好处是较少的空间存储更多的密码数据。关于盐的使用有一点需要说明加盐的目的是为了增加提前构造字典和彩虹表的代价,并不是为了加密或增加密码的计算复杂性。 背景 密码是用来进行鉴权(身份认证)一种手段,说白了就是证明你是谁。一般鉴权都可以总结为下面3种形式: 你知道什么? (如密码,密码提示问题等) 你有什么? (如信用卡,token卡等) 你...

    Godtoy 评论0 收藏0
  • nodejs-md5加盐到解密比对

    摘要:加密工具模块提供了加密功能,包括对的哈希加密解密签名以及验证功能的一整套封装。当然也是优缺点的加密相同的字符是结果都是相同的码,会出现撞库的风险。 nodejs-crypto 加密工具 crypto 模块提供了加密功能,包括对 OpenSSL 的哈希、MD5、HMAC、加密、解密、签名、以及验证功能的一整套封装。 crypto 常用的MD5 MD5 是一种不可逆的加密算法,目前是最牢靠...

    MasonEast 评论0 收藏0
  • 链接原理分析

    摘要:举个例子,第一个进来的链接发号器发号,对应的短链接为,第二个进来的链接发号器发号,对应的短链接为,以此类推。这样一来会导致一条长链接对应多条短链接的情况出现,不仅浪费存储空间,又浪费发号器资源。 1. 什么是短链接 顾名思义,短链接即是长度较短的网址。通过短链接技术,我们可以将长度较长的链接压缩成较短的链接。并通过跳转的方式,将用户请求由短链接重定向到长链接上去。短链接主要用在诸如微博...

    SexySix 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<