/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.sync.engine.lan.util;
import java.nio.charset.Charset;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.Collections;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.collections4.map.PassiveExpiringMap;
import org.apache.commons.lang.RandomStringUtils;
/**
* @author Dennis Ju
*/
public class LanTokenUtil {
public static boolean containsLanToken(String lanToken) {
return _lanTokens.contains(lanToken);
}
public static String createEncryptedToken(String lanTokenKey)
throws Exception {
String lanToken = RandomStringUtils.random(
32, 0, 0, true, true, null, _secureRandom);
byte[] bytes = DigestUtils.sha1(lanTokenKey);
bytes = Arrays.copyOf(bytes, 16);
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(bytes, "AES"));
String encryptedToken = Base64.encodeBase64String(
cipher.doFinal(lanToken.getBytes(Charset.forName("UTF-8"))));
_lanTokens.add(lanToken);
return encryptedToken;
}
public static String decryptLanToken(
String lanTokenKey, String encryptedToken)
throws Exception {
byte[] bytes = DigestUtils.sha1(lanTokenKey);
bytes = Arrays.copyOf(bytes, 16);
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(bytes, "AES"));
return new String(
cipher.doFinal(Base64.decodeBase64(encryptedToken)),
Charset.forName("UTF-8"));
}
public static boolean removeLanToken(String lanToken) {
return _lanTokens.remove(lanToken);
}
private static final Set<String> _lanTokens = Collections.newSetFromMap(
new PassiveExpiringMap(
3600, TimeUnit.SECONDS, new ConcurrentHashMap()));
private static final SecureRandom _secureRandom = new SecureRandom();
}