From 2e90f5788edf19ea154ab283b2b202b884b99c7a Mon Sep 17 00:00:00 2001 From: shimingxy Date: Sun, 12 Apr 2020 10:35:30 +0800 Subject: [PATCH] SmsOtpAuthnYunxin --- .../crypto/password/opt/AbstractOptAuthn.java | 2 +- .../password/opt/impl/MailOtpAuthn.java | 4 +- .../crypto/password/opt/impl/SmsOtpAuthn.java | 4 +- .../crypto/password/opt/impl/sms/SendSms.java | 7 - ...r.java => SmsOtpAuthnCheckSumBuilder.java} | 2 +- ...dSmsYunxin.java => SmsOtpAuthnYunxin.java} | 18 +- .../password/opt/impl/sms/package-info.java | 1 - .../java/org/maxkey/util/StringGenerator.java | 255 +++++++++--------- 8 files changed, 150 insertions(+), 143 deletions(-) delete mode 100644 maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/SendSms.java rename maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/{SendSmsYunxinCheckSumBuilder.java => SmsOtpAuthnCheckSumBuilder.java} (96%) rename maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/{SendSmsYunxin.java => SmsOtpAuthnYunxin.java} (91%) delete mode 100644 maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/package-info.java diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/AbstractOptAuthn.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/AbstractOptAuthn.java index 9192216e..1d1aa5fd 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/AbstractOptAuthn.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/AbstractOptAuthn.java @@ -33,7 +33,7 @@ public abstract class AbstractOptAuthn { private final JdbcTemplate jdbcTemplate; - public static final class OPT_TYPES { + public static final class OptTypes { // 手机 public static int MOBILE = 2; // 短信 diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/MailOtpAuthn.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/MailOtpAuthn.java index 596bd9bb..11ce77e8 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/MailOtpAuthn.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/MailOtpAuthn.java @@ -37,7 +37,7 @@ public class MailOtpAuthn extends AbstractOptAuthn { _logger.debug( "token " + token + " send to user +" + userInfo.getUsername() + ", email " + userInfo.getEmail()); - this.insertDataBase(userInfo, token, userInfo.getUsername(), OPT_TYPES.EMAIL); + this.insertDataBase(userInfo, token, userInfo.getUsername(), OptTypes.EMAIL); return true; } catch (Exception e) { e.printStackTrace(); @@ -47,7 +47,7 @@ public class MailOtpAuthn extends AbstractOptAuthn { @Override public boolean validate(UserInfo userInfo, String token) { - return this.validateDataBase(userInfo, token, OPT_TYPES.EMAIL); + return this.validateDataBase(userInfo, token, OptTypes.EMAIL); } public void setEmailConfig(EmailConfig emailConfig) { diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/SmsOtpAuthn.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/SmsOtpAuthn.java index c714ad39..564970b1 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/SmsOtpAuthn.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/SmsOtpAuthn.java @@ -15,13 +15,13 @@ public class SmsOtpAuthn extends AbstractOptAuthn { String token = this.genToken(userInfo); // TODO:You must add send sms code here - this.insertDataBase(userInfo, token, userInfo.getUsername(), OPT_TYPES.SMS); + this.insertDataBase(userInfo, token, userInfo.getUsername(), OptTypes.SMS); return true; } @Override public boolean validate(UserInfo userInfo, String token) { - return this.validateDataBase(userInfo, token, OPT_TYPES.SMS); + return this.validateDataBase(userInfo, token, OptTypes.SMS); } } diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/SendSms.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/SendSms.java deleted file mode 100644 index a589b165..00000000 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/SendSms.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.maxkey.crypto.password.opt.impl.sms; - -public interface SendSms { - - public String sendSms(); - -} diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SendSmsYunxinCheckSumBuilder.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SmsOtpAuthnCheckSumBuilder.java similarity index 96% rename from maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SendSmsYunxinCheckSumBuilder.java rename to maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SmsOtpAuthnCheckSumBuilder.java index 3b30409a..b8980824 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SendSmsYunxinCheckSumBuilder.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SmsOtpAuthnCheckSumBuilder.java @@ -2,7 +2,7 @@ package org.maxkey.crypto.password.opt.impl.sms.netease; import java.security.MessageDigest; -public class SendSmsYunxinCheckSumBuilder { +public class SmsOtpAuthnCheckSumBuilder { // 计算并获取CheckSum public static String getCheckSum(String appSecret, String nonce, String curTime) { return encode("sha1", appSecret + nonce + curTime); diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SendSmsYunxin.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SmsOtpAuthnYunxin.java similarity index 91% rename from maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SendSmsYunxin.java rename to maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SmsOtpAuthnYunxin.java index 1f803dfb..6ef319f4 100644 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SendSmsYunxin.java +++ b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/netease/SmsOtpAuthnYunxin.java @@ -11,7 +11,8 @@ import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; -import org.maxkey.crypto.password.opt.impl.sms.SendSms; +import org.maxkey.crypto.password.opt.impl.SmsOtpAuthn; +import org.springframework.jdbc.core.JdbcTemplate; /** * 网易云信的短信验证. @@ -19,7 +20,12 @@ import org.maxkey.crypto.password.opt.impl.sms.SendSms; * */ -public class SendSmsYunxin implements SendSms { +public class SmsOtpAuthnYunxin extends SmsOtpAuthn { + public SmsOtpAuthnYunxin(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + // TODO Auto-generated constructor stub + } + //发送验证码的请求路径URL private static final String SERVER_URL = "https://api.netease.im/sms/sendcode.action"; @@ -49,7 +55,7 @@ public class SendSmsYunxin implements SendSms { /* * 参考计算CheckSum的java代码,在上述文档的参数列表中,有CheckSum的计算文档示例 */ - String checkSum = SendSmsYunxinCheckSumBuilder + String checkSum = SmsOtpAuthnCheckSumBuilder .getCheckSum(APP_SECRET, NONCE, curTime); // 设置请求的header @@ -93,11 +99,5 @@ public class SendSmsYunxin implements SendSms { public static void main(String[] args) throws Exception { sendSms(null); } - - @Override - public String sendSms() { - // TODO Auto-generated method stub - return null; - } } diff --git a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/package-info.java b/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/package-info.java deleted file mode 100644 index 8d27d0ed..00000000 --- a/maxkey-core/src/main/java/org/maxkey/crypto/password/opt/impl/sms/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package org.maxkey.crypto.password.opt.impl.sms; \ No newline at end of file diff --git a/maxkey-core/src/main/java/org/maxkey/util/StringGenerator.java b/maxkey-core/src/main/java/org/maxkey/util/StringGenerator.java index 7e573be1..c6ee5a23 100644 --- a/maxkey-core/src/main/java/org/maxkey/util/StringGenerator.java +++ b/maxkey-core/src/main/java/org/maxkey/util/StringGenerator.java @@ -7,133 +7,148 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import java.util.UUID; - import org.maxkey.crypto.Base64Utils; public class StringGenerator { - private static final int MAX_PID = 65536; - - private char[] DEFAULT_CODEC = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); - - public static final char[] DEFAULT_CODE_NUMBER = "1234567890".toCharArray(); - - public static final char[] DEFAULT_CODE_LOWERCASE = "abcdefghijklmnopqrstuvwxyz".toCharArray(); - - public static final char[] DEFAULT_CODE_UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); - - public static final char[] DEFAULT_CODE_LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); - - public static final char[] DEFAULT_CODE_NUMBER_LETTERS = "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); - - public static int processId; - - private static final String uuidRegex = "^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$"; - - - private Random random = new SecureRandom(); - - private int length; - - static { - final String jvmName = ManagementFactory.getRuntimeMXBean().getName(); - int index = jvmName.indexOf('@'); - if (index < 1) - throw new RuntimeException("Could not get PID"); + private static final int MAX_PID = 65536; + + private static final char[] DEFAULT_CODEC = + "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); + + public static final char[] DEFAULT_CODE_NUMBER = "1234567890".toCharArray(); + + public static final char[] DEFAULT_CODE_LOWERCASE = "abcdefghijklmnopqrstuvwxyz".toCharArray(); + + public static final char[] DEFAULT_CODE_UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + + public static final char[] DEFAULT_CODE_LETTERS = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); + + public static final char[] DEFAULT_CODE_NUMBER_LETTERS = + "1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray(); + public static int processId; + + private static final String uuidRegex = + "^[0-9a-z]{8}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{4}-[0-9a-z]{12}$"; + + private Random random = new SecureRandom(); + + private int length; + + private char[] codec = DEFAULT_CODEC; + + static { + final String jvmName = ManagementFactory.getRuntimeMXBean().getName(); + int index = jvmName.indexOf('@'); + if (index < 1) { + throw new RuntimeException("Could not get PID"); + } try { - processId= Integer.parseInt(jvmName.substring(0, index)) % MAX_PID; + processId = Integer.parseInt(jvmName.substring(0, index)) % MAX_PID; } catch (NumberFormatException e) { throw new RuntimeException("Could not get PID"); } - } - - /** - * Create a generator with the default length (6). - */ - public StringGenerator() { - this(6); - } - - /** - * Create a generator of random strings of the length provided - * - * @param length the length of the strings generated - */ - public StringGenerator(int length) { - this.length = length; - } - - public StringGenerator(char[] defaultCode,int length) { - this.DEFAULT_CODEC=defaultCode; - this.length = length; - } - - public String randomGenerate() { - byte[] verifierBytes = new byte[length]; - random.nextBytes(verifierBytes); - return getString(verifierBytes); - } - - public String uuidGenerate() { - return UUID.randomUUID().toString().toLowerCase(); - } - - public String uniqueGenerate() { - StringBuffer uniqueString=new StringBuffer(""); - - this.length=9; - String randomString =randomGenerate(); - uniqueString.append(randomString.subSequence(0, 4)); - - Date currentDate=new Date(); - DateFormat dateFormat = new SimpleDateFormat("ddMMyyyyHHmmssSSS"); - String dateString=Base64Utils.encodeBase64(dateFormat.format(currentDate).getBytes()); - dateString=dateString.substring(0, dateString.length()-1); - uniqueString.append(dateString); - - uniqueString.append(randomString.subSequence(5, 8)); - - return uniqueString.toString(); - } - - /** - * Convert these random bytes to a verifier string. The length of the byte array can be - * {@link #setLength(int) configured}. The default implementation mods the bytes to fit into the - * ASCII letters 1-9, A-Z, a-z . - * - * @param verifierBytes The bytes. - * @return The string. - */ - protected String getString(byte[] verifierBytes) { - char[] chars = new char[verifierBytes.length]; - for (int i = 0; i < verifierBytes.length; i++) { - chars[i] = DEFAULT_CODEC[((verifierBytes[i] & 0xFF) % DEFAULT_CODEC.length)]; - } - return new String(chars); - } - - /** - * The random value generator used to create token secrets. - * - * @param random The random value generator used to create token secrets. - */ - public void setRandom(Random random) { - this.random = random; - } - - /** - * The length of string to generate. - * - * @param length the length to set - */ - public void setLength(int length) { - this.length = length; - } - - - public static boolean uuidMatches(String uuidString) { - return uuidString.matches(uuidRegex); - } - + } + + /** + * Create a generator with the default length (6). + */ + public StringGenerator() { + this(6); + } + + /** + * Create a generator of random strings of the length provided. + * + * @param length the length of the strings generated + */ + public StringGenerator(int length) { + this.length = length; + } + + public StringGenerator(char[] defaultCode, int length) { + this.codec = defaultCode; + this.length = length; + } + + /** + * randomGenerate. + * @return + */ + public String randomGenerate() { + byte[] verifierBytes = new byte[length]; + random.nextBytes(verifierBytes); + return getString(verifierBytes); + } + + public String uuidGenerate() { + return UUID.randomUUID().toString().toLowerCase(); + } + + /** + * uniqueGenerate. + * @return + */ + public String uniqueGenerate() { + StringBuffer uniqueString = new StringBuffer(""); + + this.length = 9; + String randomString = randomGenerate(); + uniqueString.append(randomString.subSequence(0, 4)); + + Date currentDate = new Date(); + DateFormat dateFormat = new SimpleDateFormat("ddMMyyyyHHmmssSSS"); + String dateString = Base64Utils.encodeBase64(dateFormat.format(currentDate).getBytes()); + dateString = dateString.substring(0, dateString.length() - 1); + uniqueString.append(dateString); + + uniqueString.append(randomString.subSequence(5, 8)); + + return uniqueString.toString(); + } + + /** + * Convert these random bytes to a verifier string. The length of the byte array + * can be {@link #setLength(int) configured}. The default implementation mods + * the bytes to fit into the ASCII letters 1-9, A-Z, a-z . + * + * @param verifierBytes The bytes. + * @return The string. + */ + protected String getString(byte[] verifierBytes) { + char[] chars = new char[verifierBytes.length]; + for (int i = 0; i < verifierBytes.length; i++) { + chars[i] = codec[((verifierBytes[i] & 0xFF) % codec.length)]; + } + return new String(chars); + } + + /** + * The random value generator used to create token secrets. + * + * @param random The random value generator used to create token secrets. + */ + public void setRandom(Random random) { + this.random = random; + } + + /** + * The length of string to generate. + * + * @param length the length to set + */ + public void setLength(int length) { + this.length = length; + } + + public void setCodec(char[] codec) { + this.codec = codec; + } + + public static boolean uuidMatches(String uuidString) { + return uuidString.matches(uuidRegex); + } + } -- GitLab