import java.time.Duration;
import java.time.Instant;
import java.util.*;
-import java.util.concurrent.TimeUnit;
import static com.supwisdom.dlpay.busqrcode.BinUtil.*;
import static com.supwisdom.dlpay.busqrcode.CryptoUtil.*;
qrDataKeys.add(FIELD_CARDTYPE);
qrDataKeys.add(FIELD_TOTP);
qrDataKeys.add(FIELD_RANDOM);
-// qrDataKeys.add(FIELD_SIGN);
+ qrDataKeys.add(FIELD_SIGN);
}
private Builder qrBuilder;
}
final byte[] sign = sha256(byteConcat(qrData.getBytes(), factor));
-// final byte[] signT = new byte[20];
-// System.arraycopy(sign, 0, signT, 0, 20); //取前20位
- final byte[] encDataPlain = byteConcat(qrData.getBytes(), DELIMITER.getBytes(), sign);
-// final byte[] encData = aesEncryptCFB(qrBuilder.rootKey, encDataPlain, qrBuilder.iv);
- final byte[] encData = aesEncryptCFB(qrBuilder.rootKey, qrData.getBytes(), qrBuilder.iv);
+ final byte[] signT = new byte[8];
+ System.arraycopy(sign, 0, signT, 0, 8); //取前8位
+ final byte[] encDataPlain = byteConcat(qrData.getBytes(), DELIMITER.getBytes(), signT);
+ final byte[] encData = aesEncryptCFB(qrBuilder.rootKey, encDataPlain, qrBuilder.iv);
final String code = encodeBase64(encData);
String result = code;
if (qrBuilder.prefix != null) {
result = qrBuilder.prefix + code;
}
if (qrBuilder.debug) {
- System.out.println("hex sign=[" + encodeHex(sign) + "]");
+ System.out.println("hex sign=[" + encodeHex(signT) + "]");
System.out.println("hex encDataPlain=[" + encodeHex(encData) + "]");
System.out.println("QR code=[" + result + "]");
System.out.println("====================== Build QR Code End =================================");
if (qrBuilder.debug) {
System.out.println("encDataPlain=[" + encData + "]");
}
- final String[] fields = encData.split(DELIMITER, 5);
- if (fields.length < 5) {
+ final String[] fields = encData.split(DELIMITER, 6);
+ if (fields.length < 6) {
throw new RuntimeException("二维码数据异常!");
}
Map<String, String> result = new HashMap<>();
final String uid = result.get(FIELD_UID);
final byte[] factor = getSignFactor(uid);
final byte[] calcSign = sha256(byteConcat(qrData.getBytes(), factor));
-// final byte[] signT = new byte[20];
-// System.arraycopy(calcSign, 0, signT, 0, 20); //取前20位
+ final byte[] signT = new byte[8];
+ System.arraycopy(calcSign, 0, signT, 0, 8); //取前8位
if (qrBuilder.debug) {
-// System.out.println("calcSign=[" + new String(calcSign) + "]");
+ System.out.println("calcSign=[" + new String(signT) + "]");
System.out.println(" sign=[" + result.get(FIELD_SIGN) + "]");
System.out.println("====================== Decode QR Code End =================================");
}
-// if (!new String(signT).equalsIgnoreCase(result.get(FIELD_SIGN))) {
-// throw new RuntimeException("二维码验证错误!");
-// }
+ if (!new String(signT).equalsIgnoreCase(result.get(FIELD_SIGN))) {
+ throw new RuntimeException("二维码验证错误!");
+ }
return result;
}