记录的小工具
- 获取IP地址
- MD5密码加密
获取IP地址
public class IpAdrressUtil {
/**
* 获取Ip地址
* @param request
* @return
*/
private static String getIpAdrress(HttpServletRequest request) {
String Xip = request.getHeader("X-Real-IP");
String XFor = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
//多次反向代理后会有多个ip值,第一个ip才是真实ip
int index = XFor.indexOf(",");
if(index != -1){
return XFor.substring(0,index);
}else{
return XFor;
}
}
XFor = Xip;
if(StringUtils.isNotEmpty(XFor) && !"unKnown".equalsIgnoreCase(XFor)){
return XFor;
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("WL-Proxy-Client-IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_CLIENT_IP");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (StringUtils.isBlank(XFor) || "unknown".equalsIgnoreCase(XFor)) {
XFor = request.getRemoteAddr();
}
return XFor;
}
}
MD5密码加密
public class PassWordGenerate_MD5 {
/*
* 密码加密
*/
public static String generate(String password){
Random r = new Random();
StringBuilder sb = new StringBuilder();
//拼接生成的随机整数
sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
int len = sb.length();
//如果拼接的随机数不满16位则加0补齐
if(len < 16){
for(int i = 0;i < 16;i ++){
sb.append("0");
}
}
//16位随机数叫"盐值"
String salt = sb.toString();
//把原始密码和盐值进行md5摘要加密
password = md5Hex(password + salt);
/*例:盐值(16位) + md5(32位) = 加密密码
* 2 8 0 9 6 6 2 9 7 3 9 0 5 6 7 5 盐值按照下面的方法插入
* e 9e fc 83 c3 ce 4b 43 40 a6 5e f5 1c f4 c0 5a d md5摘要加密
* 最后生成的密码e29e8fc0839c36ce64b2439407a635e9f501c5f46c075a5d
*/
char[] pwd = new char[48];
for(int i = 0;i < 48;i += 3){
pwd[i] = password.charAt(i / 3 * 2);
pwd[i + 1] = salt.charAt(i / 3);
pwd[i + 2] = password.charAt(i / 3 * 2 + 1);
}
return new String(pwd);
}
/*
* md5摘要
*/
private static String md5Hex(String src) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
//把明文加密成密文
byte[] bs = md5.digest(src.getBytes());
return new String (hex(bs));
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
private static String hex(byte[] arr) {
StringBuffer sb = new StringBuffer();
for(int i = 0;i < arr.length; ++ i){
sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
}
/*
*校验密码
*/
public static boolean verify(String password, String md5){
//从生成的密码中取出 md5 和 盐值
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for(int i = 0;i < 48;i += 3){
cs1[i / 3 * 2] = md5.charAt(i);
cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
cs2[i / 3] = md5.charAt(i + 1);
}
String salt = new String(cs2);
//把原密码和取得的盐值再进行md5摘要加密,然后与拆开的md5摘要加密进行比较
return md5Hex(password + salt).equals(new String(cs1));
}
// public static void main(String[] args) { //测试
// String password = generate("123456");
// System.out.println(verify("123456", password));
// System.out.println(password.toString());
// }
}