当前位置: 首页 > news >正文

衣柜推拉门图案设计网站做网站需要知道什么

衣柜推拉门图案设计网站,做网站需要知道什么,室内设计平面图软件,关于互联网的网站1.需求分析 兑换码长度为10字符#xff0c;包含24个大写字母和8个数字。兑换码需要保证唯一性#xff0c;不可重复兑换。需要防止猜测和爆刷攻击。兑换码生成和验证的算法需要高效#xff0c;避免对数据库带来较大的压力。 导航 1.需求分析2.实现方案3.加密过程4.解密过程5…1.需求分析 兑换码长度为10字符包含24个大写字母和8个数字。兑换码需要保证唯一性不可重复兑换。需要防止猜测和爆刷攻击。兑换码生成和验证的算法需要高效避免对数据库带来较大的压力。 导航 1.需求分析2.实现方案3.加密过程4.解密过程5.工具类5.1Base32工具类5.2CodeUtil工具类5.2.1.兑换码算法说明5.2.2.兑换码的明文结构5.2.3.兑换码的加密过程5.2.4.兑换码的解密过程 2.实现方案 使用自增ID作为唯一ID长度为32位整数。使用Base32编码将每5位二进制转换为一个字符。使用按位加权签名和随机新鲜值来防止刷取攻击 3.加密过程 生成4位新鲜值拼接新鲜值和序列号得到载荷用新鲜值选择加权数组计算校验码用校验码选择异或密钥异或混淆载荷拼接校验码和混淆载荷,Base32编码 4.解密过程 Base32解码得到数值分离校验码和载荷用校验码选择异或密钥恢复载荷重新计算校验码验证一致性 5.工具类 Base32用于编码和解码算法。CodeUtil用于生成和解析兑换码。 5.1Base32工具类 代码如下 import cn.hutool.core.text.StrBuilder;/** * 将整数转为base32字符的工具因为是32进制所以每5个bit位转一次 */ public class Base32 {private final static String baseChars 6CSB7H8DAKXZF3N95RTMVUQG2YE4JWPL;public static String encode(long raw) {StrBuilder sb new StrBuilder();while (raw ! 0) {int i (int) (raw 0b11111);sb.append(baseChars.charAt(i));raw raw 5;}return sb.toString();}public static long decode(String code) {long r 0;char[] chars code.toCharArray();for (int i chars.length - 1; i 0; i--) {long n baseChars.indexOf(chars[i]);r r | (n (5*i));}return r;}public static String encode(byte[] raw) {StrBuilder sb new StrBuilder();int size 0;int temp 0;for (byte b : raw) {if (size 0) {// 取5个bitint index (b 3) 0b11111;sb.append(baseChars.charAt(index));// 还剩下3位size 3;temp b 0b111;} else {int index temp (5 - size) | (b (3 size) ((1 5 - size) - 1)) ;sb.append(baseChars.charAt(index));int left 3 size;size 0;if(left 5){index b (left - 5) ((1 5) - 1);sb.append(baseChars.charAt(index));left left - 5;}if(left 0){continue;}temp b ((1 left) - 1);size left;}}if(size 0){sb.append(baseChars.charAt(temp));}return sb.toString();}public static byte[] decode2Byte(String code) {char[] chars code.toCharArray();byte[] bytes new byte[(code.length() * 5 )/ 8];byte tmp 0;byte byteSize 0;int index 0;int i 0;for (char c : chars) {byte n (byte) baseChars.indexOf(c);i;if (byteSize 0) {tmp n;byteSize 5;} else {int left Math.min(8 - byteSize, 5);if(i chars.length){bytes[index] (byte) (tmp left | (n ((1 left) - 1)));break;}tmp (byte) (tmp left | (n (5 - left)));byteSize left;if (byteSize 8) {bytes[index] tmp;byteSize (byte) (5 - left);if (byteSize 0) {tmp 0;} else {tmp (byte) (n ((1 byteSize) - 1));}}}}return bytes;} }5.2CodeUtil工具类 5.2.1.兑换码算法说明 ​ 兑换码分为明文和密文明文是50位二进制数密文是长度为10的Base32编码的字符串 5.2.2.兑换码的明文结构 14(校验码) 4 (新鲜值) 32(序列号) ​ 序列号一个单调递增的数字可以通过Redis来生成​ 新鲜值可以是优惠券id的最后4位同一张优惠券的兑换码就会有一个相同标记​ 载荷将新鲜值4位拼接序列号32位得到载荷​ 校验码将载荷4位一组每组乘以加权数最后累加求和然后对2^14求余得到 5.2.3.兑换码的加密过程 ​ 首先利用优惠券id计算新鲜值 f​ 将f和序列号s拼接得到载荷payload​ 然后以f为角标从提前准备好的16组加权码表中选一组​ 对payload做加权计算得到校验码 c​ 利用c的后4位做角标从提前准备好的异或密钥表中选择一个密钥key​ 将payload与key做异或作为新payload2​ 然后拼接兑换码明文f (4位) payload236位​ 利用Base32对密文转码生成兑换码 5.2.4.兑换码的解密过程 ​ 首先利用Base32解码兑换码得到明文数值num​ 取num的高14位得到c1取num低36位得payload​ 利用c1的后4位做角标从提前准备好的异或密钥表中选择一个密钥key​ 将payload与key做异或作为新payload2​ 利用加密时的算法用payload2和s1计算出新校验码c2把c1和c2比较一致则通过 代码如下 import com.tianji.common.constants.RegexConstants; import com.tianji.common.exceptions.BadRequestException;public class CodeUtil {/*** 异或密钥表用于最后的数据混淆*/private final static long[] XOR_TABLE {61261925471L, 61261925523L, 58169127203L, 64169927267L,64169927199L, 61261925629L, 58169127227L, 64169927363L,59169127063L, 64169927359L, 58169127291L, 61261925739L,59169127133L, 55139281911L, 56169127077L, 59169127167L};/*** fresh值的偏移位数*/private final static int FRESH_BIT_OFFSET 32;/*** 校验码的偏移位数*/private final static int CHECK_CODE_BIT_OFFSET 36;/*** fresh值的掩码4位*/private final static int FRESH_MASK 0xF;/*** 验证码的掩码14位*/private final static int CHECK_CODE_MASK 0b11111111111111;/*** 载荷的掩码36位*/private final static long PAYLOAD_MASK 0xFFFFFFFFFL;/*** 序列号掩码32位*/private final static long SERIAL_NUM_MASK 0xFFFFFFFFL;/*** 序列号加权运算的秘钥表*/private final static int[][] PRIME_TABLE {{23, 59, 241, 61, 607, 67, 977, 1217, 1289, 1601},{79, 83, 107, 439, 313, 619, 911, 1049, 1237},{173, 211, 499, 673, 823, 941, 1039, 1213, 1429, 1259},{31, 293, 311, 349, 431, 577, 757, 883, 1009, 1657},{353, 23, 367, 499, 599, 661, 719, 929, 1301, 1511},{103, 179, 353, 467, 577, 691, 811, 947, 1153, 1453},{213, 439, 257, 313, 571, 619, 743, 829, 983, 1103},{31, 151, 241, 349, 607, 677, 769, 823, 967, 1049},{61, 83, 109, 137, 151, 521, 701, 827, 1123},{23, 61, 199, 223, 479, 647, 739, 811, 947, 1019},{31, 109, 311, 467, 613, 743, 821, 881, 1031, 1171},{41, 173, 367, 401, 569, 683, 761, 883, 1009, 1181},{127, 283, 467, 577, 661, 773, 881, 967, 1097, 1289},{59, 137, 257, 347, 439, 547, 641, 839, 977, 1009},{61, 199, 313, 421, 613, 739, 827, 941, 1087, 1307},{19, 127, 241, 353, 499, 607, 811, 919, 1031, 1301}};/*** 生成兑换码** param serialNum 递增序列号* return 兑换码*/public static String generateCode(long serialNum, long fresh) {// 1.计算新鲜值fresh fresh FRESH_MASK;// 2.拼接payloadfresh4位 serialNum32位long payload fresh FRESH_BIT_OFFSET | serialNum;// 3.计算验证码long checkCode calcCheckCode(payload, (int) fresh);System.out.println(checkCode checkCode);// 4.payload做大质数异或运算混淆数据payload ^ XOR_TABLE[(int) (checkCode FRESH_MASK)];// 5.拼接兑换码明文: 校验码14位 payload36位long code checkCode CHECK_CODE_BIT_OFFSET | payload;// 6.转码return Base32.encode(code);}private static long calcCheckCode(long payload, int fresh) {// 1.获取码表int[] table PRIME_TABLE[fresh];// 2.生成校验码payload每4位乘加权数求和取最后13位结果long sum 0;int index 0;while (payload 0) {sum (payload 0xf) * table[index];payload 4;}return sum CHECK_CODE_MASK;}public static long parseCode(String code) {if (code null || !code.matches(RegexConstants.COUPON_CODE_PATTERN)) {// 兑换码格式错误throw new BadRequestException(无效兑换码);}// 1.Base32解码long num Base32.decode(code);// 2.获取低36位payloadlong payload num PAYLOAD_MASK;// 3.获取高14位校验码int checkCode (int) (num CHECK_CODE_BIT_OFFSET);// 4.载荷异或大质数解析出原来的payloadpayload ^ XOR_TABLE[(checkCode FRESH_MASK)];// 5.获取高4位freshint fresh (int) (payload FRESH_BIT_OFFSET FRESH_MASK);// 6.验证格式if (calcCheckCode(payload, fresh) ! checkCode) {throw new BadRequestException(无效兑换码);}return payload SERIAL_NUM_MASK;} }
http://www.dnsts.com.cn/news/155106.html

相关文章:

  • 怎样修改静态公司网站页面电话合肥网站建设黄页
  • 河南省建设厅网站门户建筑公司企业资料
  • 深圳设计公司最多的地方在哪如何写一份网站优化建设的方案
  • 浏览器编程语言手机优化大师哪个好
  • 公司建设网站申请报告范文以前做的网站怎么才能登陆后台
  • 网站服务器有哪些类型建行卡如何网上签约
  • 旅游网站系统设计萍乡网站建设公司
  • cms建站是什么.net做网站的吗
  • 室内设计接单的网站网站开发实战演练
  • 在线制作软件天津网站优化公司哪家好
  • 天津seo网站排名优化公司橙色网站后台模板
  • 网站限时抢购怎么做drupal个人门户网站开发
  • 如何设立网站医疗网站设计方案
  • wap 手机网站建设网站提交收录
  • 网站用户互动手机会员卡管理系统免费版
  • 网站建设工作人员有哪些职责手机购物网站源码
  • 一般公司做网站多少钱wordpress 图片分页
  • windows优化大师下载安装seo加wordpress工程师
  • 茶叶网站实际案例wordpress视频站代码
  • 展览会建设网站平台的作用wordpress 图片中文名
  • 网站开发技术考试题目外国做的中国动画视频网站
  • 北京管庄网站建设公司威联通做网站
  • dw建设网站的代码模板什么是企业云网站建设
  • 上海建筑公司排名有了网站怎么做优化
  • 如何开网站建设公司wordpress迁移后媒体库丢失
  • 教育加盟培训网站建设建设局网站信息发布规定
  • vs手机网站开发aspnet网站开发源码
  • 网站备案了有什么好处wordpress主题制做
  • 个人网站模板 免费网站制作公司一站式服务
  • 做网站优化就是发文章吗做网站用的字体