好久不编码了,正发碰上同事要用,就匆匆忙忙写了一段,以后有时间还是要自己多写点东西玩,IDE的快捷键都忘了不少,唉~
package com.krynn.raistlin;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import weblogic.apache.xerces.impl.dv.util.Base64;
/**
* @author Raistlin
*
*/
public class LDAPPWVerify {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("USER-A,123:"
+ verifySHA("{SSHA}u2tWu+5vUGHxwrtmNfsZ9HmVrd5SMt16NAODEA==",
"123"));
System.out.println("USER-A,1234:"
+ verifySHA("{SSHA}u2tWu+5vUGHxwrtmNfsZ9HmVrd5SMt16NAODEA==",
"1234"));
System.out.println("USER-B,12345678:"
+ verifySHA("{SSHA}J5AvX6TexS54iJQttTnRz41Gn3jlGdhNPijLSA==",
"12345678"));
System.out.println("USER-B,123:"
+ verifySHA("{SSHA}J5AvX6TexS54iJQttTnRz41Gn3jlGdhNPijLSA==",
"123"));
System.out.println("USER-C,internet:"
+ verifySHA("{SSHA}Dw/8FJCva32hA765mLk/K4WXgMk3bOsIfgBOfw==",
"internet"));
System.out.println("USER-C,123:"
+ verifySHA("{SSHA}Dw/8FJCva32hA765mLk/K4WXgMk3bOsIfgBOfw==",
"123"));
}
/**
* 用于用户密码在LDAP进行验证
*
* @param ldappw
* LDAP中取出的用户密码
* @param inputpw
* 用户输入的用户密码
* @return 是否验证通过
* @throws NoSuchAlgorithmException
*/
public static boolean verifySHA(String ldappw, String inputpw)
throws NoSuchAlgorithmException {
// MessageDigest 提供了消息摘要算法,如 MD5 或 SHA,的功能,这里LDAP使用的是SHA-1
MessageDigest md = MessageDigest.getInstance("SHA-1");
// 取出加密字符
if (ldappw.startsWith("{SSHA}")) {
ldappw = ldappw.substring(6);
} else if (ldappw.startsWith("{SHA}")) {
ldappw = ldappw.substring(5);
}
// 解码BASE64
byte[] ldappwbyte = Base64.decode(ldappw.getBytes());
byte[] shacode;
byte[] salt;
// 前20位是SHA-1加密段,20位后是最初加密时的随机明文
if (ldappwbyte.length <= 20) {
shacode = ldappwbyte;
salt = new byte[0];
} else {
shacode = new byte[20];
salt = new byte[ldappwbyte.length - 20];
System.arraycopy(ldappwbyte, 0, shacode, 0, 20);
System.arraycopy(ldappwbyte, 20, salt, 0, salt.length);
}
// 把用户输入的密码添加到摘要计算信息
md.update(inputpw.getBytes());
// 把随机明文添加到摘要计算信息
md.update(salt);
// 按SSHA把当前用户密码进行计算
byte[] inputpwbyte = md.digest();
// 返回校验结果
return MessageDigest.isEqual(shacode, inputpwbyte);
}
}