防刷发送短信验证码接口的五种简单好用方法绝对够用

防刷发送短信验证码接口的五种简单好用方法绝对够用

前后端增加一个对称加密的校验码

准备:密钥 1234abcd;约定明文中必须包含指定字符串miyao1234

1.前端调用发送短信接口前,通过密钥(1234abcd)与加密算法,将miyao1234+(16位英文字母与数字字符串) 例如miyao1234wgly1noKSXg47Mn6 进行加密

生成校验码 vBOLxJj3wl1IyJNUcXOPvaeXvgLZK0b4f3D4J6k9DvE=

2.前端调用发送短信接口时,将校验码传递给后端

3.后端接收到后对校验码进行解密,如果解密失败,提示失败

4.如果解密后不包含约定字符串miyao1234 ,提示失败

5.如果解密后包含约定字符串miyao1234,则通过校验,此时注意⚠️,需要将此校验码存入redis,下次如果有相同校验码 则提示重复

/**

* 解密后的验证码必须包含此值

*/

public static final String ENCRYPT_KEY_MAIN_WORD = "miyao1234";

//密钥1234abcd

public static final String encryptKey = "1234abcd";

Validate.notBlank(keyDecrypt,"发送短信时,校验码不能为空");

//进行解密

String decrypt = this.decrypt(keyDecrypt);

LOGGER.error("发送验证码解密后的校验码"+decrypt);

if(StringUtils.isEmpty(decrypt) || !decrypt.contains(ENCRYPT_KEY_MAIN_WORD)){

throw new RuntimeException("发送验证码校验失败");

}

//设置过期时间为当天23:59:59

// 每个校验码每天只能重复使用一次

String repeatLock = StringUtils.join("decrypt_send_sms:", decrypt);

LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.of(23, 59, 59));

long secondsUntilMidnight = ChronoUnit.SECONDS.between(LocalDateTime.now(), todayEnd);

// 使用 Redis 的 setIfAbsent 进行原子性操作,尝试设置键值对,如果键已存在则返回 false

if (!redisTemplate.opsForValue().setIfAbsent(repeatLock, "locked", secondsUntilMidnight, TimeUnit.SECONDS)) {

// 键已存在,表示校验码重复

throw new RuntimeException("校验码重复!");

}

public String decrypt(String decrypt) {

if (StringUtils.isBlank(decrypt)) {

return decrypt;

}

return Aes128Utils.decrypt(decrypt, encryptKey, Aes128Utils.EncodeType.CBC, Aes128Utils.Padding.PKCS_7_PADDING);

}

💎 相关推荐

告别计算器小白:带你了解计算器各个按键的功用
365bet体育在线网站

告别计算器小白:带你了解计算器各个按键的功用

📅 08-20 👁️ 9661
iPhone手机如何查看电池健康状态?
365bet怎么样

iPhone手机如何查看电池健康状态?

📅 09-20 👁️ 1389