设备动态密码设计

我们再把需求列出来:

(1)密码只能是阿拉伯数字,而且不能太长,一般要求10位以下,否则记不住,或让人感觉厌烦。

(2)密码包含用户信息,系统能知道是谁对设备进行了操作。

(3)密码是动态的,每次都不一样。

(4)密码能够防止恶意篡改。

说白了,就是密码里包含用户信息、时间信息,校验信息,但只能有8个阿拉伯数字。这是可以做到的,为什么?因为我最后做出来了。

好,我们先从8个阿拉伯数字出发,8个数字,最大就是99999999,如果用二进制来看,我们最多用26位(67108864)。

我们使用12位代表4096个不同的用户,基本满足需求。只剩下14位可用了。

时间信息需要保存年月日,如果使用一个字节保存一个数字(例如BCD码),共需要24位(3个字节),一下子就超了。把它们拆分,精确到位,最省的情况如下表所示:

信息
所需位 6 4 5

这样的话,我们省了很多,但仍然用掉了15位,超出了我们的限额。我们希望在时间信息上挤出空间来。

我们假设有这样一个函数f(y,m,d),它把时间信息转化成一个数,不同的日期对应不同的值,不会重复。考虑最简单的情况,我们把函数定义成如下形式:

f(y,m,d)=ay+bm+cd

那么,另外一个日期对应的值为:

f(y’,m’,d’)=ay’+bm’+cd’

只要在y!=y’,m!=m’,d!=d’的情况下,f(y,m,d)!=f(y’,m’,d’)即满足需求。

f(y,m,d)-f(y’,m’,d’)=(ay+bm+cd)-(ay’+bm’+cd’)

=a(y-y’)+b(m-m’)+c(d-d’)

由于年的变化是很缓慢的,我们考虑在一年内,都没有重复的值。也就是

b(m-m’)+c(d-d’)=bΔm+cΔd!=0

即bΔm!=-cΔd

我们知道,月的变化取值为1-12,日的变化取值为1-31,那么Δm的取值为-11~11,Δd的取值为-30~30。考虑到有负数的存在,上式我们直接可以写成:

b/c!=Δd/Δm

我们可以看出,只要b取31,上式两边就永远不会相等。也就是说,

f(y,m,d)=y+31m+d

在一年内也不会有重复的值。

这样的话,此式最大的值为31*12+31+99(考虑年用到2099)=502,我们用9位(512)即能表示。

经过上面的时间信息缩减之后,我们剩下5位来存放校验信息。常见的一些校验算法根本是无法使用的(MD5要16字节,而且计算复杂,CRC两个字节,最简单的算LRC也要一个字节8位)。如果单纯用5位做校验和,重复的概率是1/32,感觉不够安全。

我们已经没办法再缩减时间信息使用的位数,只能考虑对用户ID开刀。用户ID使用12位存放4096个用户的信息,这是我们考虑极限的用户数。在一开始,或许512个用户就能满足。于是,我们采取这样的折中方案:

(1)用户ID使用9位,把3位让给校验和,这样重复的概率是1/256,应该是可以使用的。

(2)当用户增长超过512时,我们增加数字位数。如果使用9位阿拉伯数字,我们可以存放29位的信息,多出3位,增加在用户ID上,一共可存放4096个用户。

上面的设计,还没有满足需求里的第3、5点。要让密码每次都不一样,其实我们只需要增加几位,放一个随机数就行。但偏偏我们已经没有空间去放这个随机数了。

在这里,我们需要先说明使用何种加密方法。为了足够的简单(保证仪器能快速计算),又不失安全性,我们使用异或的加密方法。只要用户猜不到跟明文异或的密码,数据就是安全的。

我们回到上面的问题。如果我们使用不同的密码去对明文进行异或,得到的结果就是不一样的。所以我们有一种这样的方案:存放N条用于异或的密码,每次用不同的密码去异或,就会产生不同的结果。解密的时候,我们寻回原先异或的密码,就能成功解密。

但是我们马上会发现问题:我们如何知道明文是使用了哪个密码去异或的呢?用户ID和时间信息都是固定的,我们无法从这些信息里面提取出一个索引。那我们可以使用当前时间作为一个索引。假如我们有24个密码,各对应24个小时。这样的话,我们在使用动态密码时,会多出一条限制:从平台上获取密码之后,必须在一个小时内使用。这样的限制并不影响,可行。

在我们使用多个密码去异或时,原来的校验和算法会出现问题。我们必须找出24个异或码,经过跟明文异或之后,不影响原文的校验和。这样的异或码可以使用以下方法得到:

(1)因为我们使用8位校验和,所以我们把数据分成8位一段,不够的使用0补齐。

(2)把(总位数-8)个位随机填充0或1。

(3)求出(总位数-8)个位的校验和。

(4)把这个校验和填充到剩下的8位里面。

最终方案

动态密码的设计如下:

8位阿拉伯数字
信息 时间 校验和 用户ID
位数 9 8 9
9位阿拉伯数字
信息 时间 校验和 用户ID
位数 9 8 12

时间=(年-2018)+31*月+日

校验和为8位一段异或。

加密方法是将整个明文跟密钥进行异或。

机器码、序列号、认证码、注册码的生成算法(二)相关推荐

  1. 怎么用python生成带二维码的照片_怎么制作二维码图片-Python 生成个性二维码

    一.实验介绍1.1 实验内容 本课程通过调用MyQR接口来实现生成个人所需二维码,并可以设置二维码的大小.是否在现有图片的基础上生成.是否生成动态二维码. 1.2 知识点 Python3基础 MyQR ...

  2. 分享一款电脑使用的二维码/条码扫描生成软件--二维码识别精灵

    功能: 从摄像头识别二维码.条码 从文件读取二维码.条码 识别屏幕中的二维码.条码 文本生成二维码,支持导出为图片 绿色软件,免安装,使用简单,没有病毒 体积小而效率高,运行速度快 摄像头毫秒级的识别 ...

  3. thinkphp用phpqrcode生成二维码(含中间带logo、临时二维码)或生成微信二维码海报的方法

    前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/ 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都 ...

  4. 网页前端知识汇总(三)——网页前端利用二维码插件qrcode生成在线二维码

    最近几年二维码的广泛应用,方便了很多行业,如支付宝,微信,小程序扫码之类的,这个在二十年前,想都不敢想这么方便,那时候有书刊编码扫一扫都感觉是高科技了,如今,二维码的广泛应用,生活还是方便了不少!这个 ...

  5. 微信支付 生成付款二维码链接 并生成支付二维码图片 .net C#

    //生成付款二维码链接                 string pay_url = PayURL(order_id_parent.ToString(), _total_fee.ToString( ...

  6. 【彩色二维码】处理生成彩色二维码图片

    调用草料二维码的API接口 https://cli.im/api/qrcode/code?text=***&mhid=*** mhid:草料二维码的模版样式id,这里选择的是[vUbEWVm7 ...

  7. vue批量生成二维码,打印生成的二维码,并批量下载生成的二维码,qrcode

    通过使用 qrcode 生成二维码, 使用 jszip 打包批量二维码文件, 使用 file-saver 下载打包好的zip文件, 使用 vue-print-nb 打印生成的二维码 生成二维码: 打印 ...

  8. 公众号文章链接怎么做二维码?在线生成链接二维码的方法

    公众号是现在品牌运营时必备的一个渠道,通过不断地发表公众号推文来提高自己的品牌力,那么如果想要将一篇公众号文章生成二维码(二维码在线制作-二维码生成器-音视频二维码制作工具-机制熊二维码)后分享给他人 ...

  9. jquery.qrcode生成带logo的二维码,同时生成带二维码的好友分享图片(js与canvas实现二维码和图片合成的海报)

    首先给大家看一下效果图(纯jQuery前端技术): 提供一下demo 源代码和jquery.qrcode文件下载: https://download.csdn.net/download/qq15577 ...

最新文章

  1. OVS使用笔记(四十三)
  2. 软件工程的实践项目课程的自我目标
  3. 《Adobe Photoshop CS6中文版经典教程(彩色版)》—第2课2.4节在Camera Raw中调整颜色...
  4. JSFinder—从js文件中寻找敏感接口和子域名
  5. leetcode214. 最短回文串
  6. 统计单词个数(codevs 1040)
  7. 解决 Electron 5.0 版本出现 require is not defined 的问题
  8. 腾讯云服务器购买与备案
  9. Linux实用命令杂集
  10. c语言 如何筛选小数点,怎样在表格里筛选有出整数与有小数点的数值
  11. 今天你吃粽子了吗?快进来看看你都吃过哪一种粽子吧
  12. 【Appium】最新版appium-inspector的安装
  13. 企业托管主机的时候需要考虑哪些影响因素?
  14. linux系统发育树的构建步骤,megacc构建进化树.mao文件生成方法
  15. 关于专利书写以及申报的一点心得体会
  16. 微软CRM系统二次开发步骤以及注意事项
  17. 低成本复制 ChatGPT 训练流程,仅需 1.68GB GPU 即可使用,方法现已开源!
  18. 步步高家教机 H8S H9A 破解纯净原生系统 线刷包
  19. php x7f,这个正则中的x7f-xff是什么意思
  20. VMware + Ubantu18.04 搭建Hadoop集群环境

热门文章

  1. 图像分割评价指标模型总结
  2. 深入浅出:JWT(JSON Web Token)鉴权
  3. 企业微信外部群和内部群有什么区别?如何创建外部群
  4. 【我的职场思想之转折点】
  5. 关于我求是不是质数的一个错误,输入9判断是质数的原因
  6. WIFI6模块 802.11ac/ax AP6275S
  7. 对话李志飞:出门问问最早将于2019年底考虑上市
  8. 如何规划自己的职业生涯
  9. 7-14 直捣黄龙 (30 分)
  10. 废纸篓清空|mac删除的文件如何恢复