安全认证工具类
import java.util.Date;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.util.Assert;
import lombok.Data;
@Data
public class AppSign {
private static final long TIME_DIFF = 10 * 60 * 1000L;
protected static final Log logger = LogFactory.getLog(AppSign.class);
private String appkey;
private String nonce;
private String timestamp;
private String account;
public AppSign(String nonce, String timestamp, String appkey, String account) {
Assert.hasText(appkey, "appkey为空!");
Assert.hasText(nonce, "nonce为空!");
Assert.hasText(timestamp, "timestamp为空!");
Assert.hasText(account, "account为空!");
this.nonce = nonce;
this.timestamp = timestamp;
this.appkey = appkey;
this.account = account;
}
public static void checkTime(String timestamp) {
if ((new Date().getTime() - Long.valueOf(timestamp).longValue()) > TIME_DIFF) {
throw new RuntimeException("安全认证超时了!");
}
}
public String getSignature(String appSecret) {
StringBuilder sb = new StringBuilder();
sb.append(appSecret);
sb.append(nonce);
sb.append(timestamp);
sb.append(account);
return DigestUtils.sha1Hex(sb.toString());
}
public void checkSignature(String appSecret, String configAppKey, String urlSignature) {
if (!StringUtils.equals(configAppKey, appkey)) {
throw new RuntimeException("参数appkey不匹配出错!");
}
checkTime(timestamp);
boolean flag = StringUtils.equals(getSignature(appSecret), urlSignature);
if (flag == false) {
System.err.println("getSignature=" + getSignature(appSecret));
System.err.println("urlSignature=" + urlSignature);
throw new RuntimeException("校验数字签名出错!");
}
}
}
具体接口调用工具类
public class App01SignUtil {
public static void main(String[] args) {
String url = App01SignUtil.getSsoUrl("100027");
System.err.println("url=" + url);
}
public static String getSsoUrl(String tarAccount) {
String appkey = getAppkey();
String nonce = Math.random() + "";
String timestamp = System.currentTimeMillis() + "";
String signature = App01SignUtil.getInstance(nonce, timestamp, appkey, tarAccount).getSignature();
StringBuilder sb = new StringBuilder();
sb.append("http://localhost:8080/sso.html");
sb.append("?appkey=" + appkey);
sb.append("&nonce=" + nonce);
sb.append("×tamp=" + timestamp);
sb.append("&signature=" + signature);
sb.append("&tarAccount=" + tarAccount);
return sb.toString();
}
private AppSign appSign;
private App01SignUtil() {}
public static App01SignUtil getInstance(String nonce, String timestamp, String appkey, String account) {
App01SignUtil util = new App01SignUtil();
AppSign appSign = new AppSign(nonce, timestamp, appkey, account);
util.appSign = appSign;
return util;
}
public void checkSignature(String urlSignature) {
appSign.checkSignature(getAppSecret(), getAppkey(), urlSignature);
}
public String getSignature() {
return appSign.getSignature(getAppSecret());
}
private static String getAppkey() {
return "my-app-key";
}
private static String getAppSecret() {
return "f6cea9ccbfbdaa8cf1284aeca32d7a8e4913cc8f";
}
}