【ApacheShiro】1.shiro加密及编解码          返回主页

最近在做一个网站,需要对用户信息进行加密,认证。提高相对的信息安全。

由于是偏商业的网站,不能像自己做课程设计时贪图方便采用明文传输,在调研之后注意到了Apache的Shiro框架。

什么是Shiro


Apache Shiro是一个功能强大、灵活的,开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。可为任何应用提供安全保障---从命令行应用、移动应用到大型网络及企业应用。


本文就Shiro的加密及编解码进行相应的讲解,供读者参考。


一.base64编解码

    String string1 = "abcde";
    String base64Encode = Base64.encodeToString(string1.getBytes());
    System.out.println(base64Encode);
    String base64Decode = Base64.decodeToString(base64Encode);
    System.out.println(base64Decode);
    /*
     * base64加密
     */
    if (base64Encode.equals(Base64.encodeToString("abcde".getBytes()))) {
        System.out.println("相等字串");
    } else {
        System.out.println("不相等");
    }

输出结果

YWJjZGU=
abcde
相等字串

解释

  1. 定义一个字符串,可以是传入的用户名/密码,调用shiro的Base64.encodeToString静态方法可将此字符串(需转为byte形式)转换为相应的base64格式字符串。
  2. 将此转码后的字符串与数据库中已经进行过转码的字串进行比对,相等则说明密码/用户名正确。
  3. Base64.decodeToString为shiro的解码静态方法。与前者相似不赘述。

二.MD5加密

    String str1 = "hello";
    String salt = "12";
    String md5 = new Md5Hash(str1, salt).toString();
    System.out.println(md5);

    if ((new Md5Hash("hello", salt).toString()).equals(md5)) {
        System.out.println("ok");
    } else {
        System.out.println("no");
    }

运行结果

132017ca4f9fde7a8011b76f24de44b4
ok

解释

  1. Md5Hash类的构造方式其中之一为

    1. public Md5Hash(Object source, Object salt) {
        super("MD5", source, salt);
    }
    

    该方法接受两个参数,分别为源字符串(待加密字串),salt串,即我们经常说的“加盐”。

    散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,
    一般适合存储密码之类的
    数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如
    加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一
    些md5 解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相
    对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和ID(即盐);
    这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。
                    --《跟我学shiro》 张开涛
    
  2. 调用toString方法将结果转为字符串即132017ca4f9fde7a8011b76f24de44b4。这串奇怪的字串即为哈希过的串。保存到数据库中即使泄露也能相对保证安全。

  3. 当用户登录时,将其密码进行hash之后与数据库中的对应用户名的哈希串进行比对相等则表明认证成功。

小结

在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前 的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。