解决linux系统下和windows系统下base64加密解密密文不一致的问题

我在用base64做密码加密解密的时候在windows上加密解密是没有问题的,但是在linux系统下加密解密的时候发现每次相同的密码加密后密文不同,导致我把项目部署到linux系统下登录系统的时候老是提示我密码不对,以下是我解决问题的总结,希望对大家有帮助,在两种情况下对密码加密的解决一种是cas单点登录下的密码加密,另一种是普通的登录加密解决。废话不多说直入主题,代码:
一:在cas单点登录下密码加密的解决:

package org.nci.platform.utils;

import java.io.PrintStream;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.jasig.cas.authentication.handler.PasswordEncoder;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Util implements PasswordEncoder
{
  private static final int LENGTH = 128;
  private static final String ENCODE = "UTF-8";
  private static final String defaultKey = "Mi_mAWo.La0+nAnlE";
  private static final String defaultPrefix = "==";

  public static String encrypt(String content)
  {
    String value = "";
    try {
      if (!isEmpty(content))
        value = "==" + base64Encode(aesEncryptToBytes(content));
    }
    catch (Exception e) {
      System.out.println("EncryptAndDecrypt(加密错误)");
      e.printStackTrace();
    }
    return value;
  }

  public static String decrypt(String encryptStr)
  {
    String value = "";
    try {
      int length = "==".length();
      if (encryptStr.length() > length) {
        String val = encryptStr.substring(0, length);
        if (val.equals("=="))
          value = aesDecryptByBytes(base64Decode(encryptStr.substring(length)));
        else
          value = encryptStr;
      }
      else {
        value = encryptStr;
      }
    } catch (Exception e) {
      System.out.println("EncryptAndDecrypt(解密错误)");
      e.printStackTrace();
    }
    return value;
  }

  public static byte[] aesEncryptToBytes(String content)
    throws Exception
  {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed("Mi_mAWo.La0+nAnlE".getBytes());
    kgen.init(128, secureRandom);

    Cipher cipher = Cipher.getInstance("AES");
    SecretKeySpec sks = new SecretKeySpec(kgen.generateKey().getEncoded(), "AES");
    cipher.init(1, sks);
    return cipher.doFinal(content.getBytes("UTF-8"));
  }

  public static String aesDecryptByBytes(byte[] encryptBytes)
    throws Exception
  {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed("Mi_mAWo.La0+nAnlE".getBytes());

    kgen.init(128, secureRandom);
    Cipher cipher = Cipher.getInstance("AES");
    SecretKeySpec sks = new SecretKeySpec(kgen.generateKey().getEncoded(), "AES");
    cipher.init(2, sks);
    byte[] decryptBytes = cipher.doFinal(encryptBytes);
    return new String(decryptBytes);
  }

  public static String base64Encode(byte[] bytes)
  {
    return new BASE64Encoder().encode(bytes);
  }

  public static byte[] base64Decode(String base64Code)
    throws Exception
  {
    return isEmpty(base64Code) ? null : new BASE64Decoder().decodeBuffer(base64Code);
  }

  public static boolean isEmpty(String str) {
    return (str == null) || ("".equals(str.trim()));
  }

  public String encode(String password) {
    String end = encrypt(password);
    return end;
  }
}

实现PasswordEncoder接口需要把cas-server-core-4.0.0.jar(该jar包可以去我的csdn下载)放入cas的lib下把上述的代码块打成jar包放入cas的lib目录下如下图:

在这里插入图片描述
同时需要在deployerConfigContext.xml文件配置,如下图:
在这里插入图片描述

二:在普通登录下密码加密的解决:
还是和上面的方式一样,只是不需要实现PasswordEncoder接口。

结果:
在这里插入图片描述

总结:
注意:在openjdk1.7下是不可以的,在jdk1.7下和openjdk1.8(包括openjdk1.8)以上是可以的
第一次遇到这样的问题,最后解决了。在开发中会遇到各种各样的问题,有问题不怕,我们还是有一个去解决问题的心。希望对各位有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值