使用Apache Shiro进行身份认证-密码加密

在进行身份认证时,用户的密码一般是用密文的形式存放在数据库中。这样在做比对时不能直接使用用户提交的明文口令。

在Shiro中使用org.apache.shiro.authc.credential.SimpleCredentialsMatcher做凭证信息的比对。SimpleCredentialsMatcher实现了

凭证信息的明文比对,即对凭证信息不做任何处理。

通过HashedCredentialsMatcher子类的扩展Shiro支持一些标准的加密算法,如MD5 和 SHA-1。

在使用时也可以根据自身需求定义自己的加密算法。下面是我实现的凭证信息比对类,加密算法是在网上找的DES算法。

public class CustomCredentialsMatcher extends SimpleCredentialsMatcher {

	@Override
	public boolean doCredentialsMatch(AuthenticationToken token,
			AuthenticationInfo info) {
		Object tokenCredentials = encrypt(toBytes(token.getCredentials()));
		Object accountCredentials = getCredentials(info);
		return equals(tokenCredentials, accountCredentials);
	}

	private byte[] encrypt(byte[] data) {
		try {
			byte[] key = "11111111".getBytes();

			// DES算法要求有一个可信任的随机数源

			SecureRandom sr = new SecureRandom();

			// 从原始密钥数据创建DESKeySpec对象
			DESKeySpec dks = new DESKeySpec(key);

			// 创建一个密匙工厂,然后用它把DESKeySpec转换成

			// 一个SecretKey对象

			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

			SecretKey secretKey = keyFactory.generateSecret(dks);

			// using DES in ECB mode

			Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

			// 用密匙初始化Cipher对象

			cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);

			// 执行加密操作

			byte encryptedData[] = cipher.doFinal(data);

			return encryptedData;

		} catch (Exception e) {

			System.err.println("DES算法,加密数据出错!");

			e.printStackTrace();

		}
		return null;
	}
}

使用时在Shiro.ini文件中加上这个类:

[main]
customMatcher = main.java.name.peter.shiro.realm.CustomCredentialsMatcher
jdbcRealm.credentialsMatcher = $customMatcher



你可能感兴趣的:(apache,算法,加密,exception,shiro,byte)