前几天看到一个提问:如何设置一个自己记不住的密码?正好最近在做excel表,我考虑了一下,觉得用 excel可以生成一个。
针对这个提问,我觉得:如果密码足够长,一般应该不必担心自己会记住,“记不住”应该指的是短密码。所以,以“4位密码”为考虑对象,设计了一个制作密码的方法。
如何制作一个自己记不住的4位密码呢?
首先,制作一个不容易记住的密码的一个办法是:利用“删除键”使输入过程复杂化——先输入A位密码、然后点击B次删除键、再输入C位密码、再点击D次删除键……循环操作,当过程达到一定长度后,使有效输入位数达到要求位数而结束。如果不去刻意记忆,则这个方法比较容易使你不知道自己输入了什么,所以也就记不住。要注意的是,在达到希望的复杂程度前,有效输入的密码位数要始终小于要求的密码位数,否则可能导致操作失败,例如在达到密码位数之后软件自动确认进入下一步等。
其次,在获得密码之后,在使用和保存的过程中,最好防止看到密码;另外,在需要使用密码时,可以一次只显示所需的“1位”而不是全部;在保存的时候,可以将上述过程产生的密码拆分为记录输入和删除操作的“位号”部分和实际输入字符的“字符”部分的两组数据,组合之后才是密码,这样,即便看到计算结果也不会“记住”密码。
下面举一个利用excel做的实现上述过程的例子。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
已制作好的excel表格如图(由于每个人希望的“循环输入次数”是不同的,所以,这个表格的大小对每个人是不一样的,本例使用了A列—BH列共60列,每个循环占用3列,可以容纳最多20次循环的数据) :
表格功能的说明:
计算密码:每次按F9刷新或进行某个操作(例如输入数据、打开和关闭文档等)都会使excel重新计算,从而会计算出一个新密码。保存密码:由于“计算密码”的过程使用了随机公式,公式结果会随excel操作实时变化,因此需将符合要求的随机密码保存为固定的文本。显示密码:当需要显示密码而又不希望看到密码时,可以使用显示密码功能,每次只显示出“1”位密码,其他部分不可见;返回密码:由于最终的密码由“位号”和“字符”两个数据组成,在下次使用的时候,为了方便重新显示密码,将上述两个数据组合为原密码。
各行的说明:
第一行是设置区:B1单元格代表循环次数,需要“计算密码”时,只要在此输入一个数字,excel就会计算密码;D1单元格是“保存密码”时用的,起干扰作用,如果在此设置一个数字(也可以不设置),则会在“字符”结果的末尾随机加入一个位数小于等于该设置的数字,使得就算看到“字符”,也不知道它的结尾是哪,这个干扰只是保存密码的时候有效,在显示密码的时候不起作用;F1和H1单元格是在需要“返回密码”时使用的,输入“位号”和“字符”两组数据,就会返回对应的完整密码;J1单元格是在“显示密码”时使用的,起干扰作用。如果密码输入界面允许输入超过目标位数(4位)的数据,就是说当位数达到要求(4位)以后继续点击按键不会导致错误,则可以设置(也可以不设置)在密码尾部增加冗余,这样不会“记住”最后输入的几位。但冗余输入结束后,实际密码的长度可能会多出来几位,只要把超过4位的部分删除掉即可;如果不确定,最好设置为空,否则也可能导致密码丢失,因为冗余的几位是随机计算的,无法保存。L1单元格是“计算密码”时使用的,由于目标位数是“4”位,所以,最终需要看到L1单元格的内容为“1-14”(“1”代表输入一位字符、“-1”代表在原表示点击删除键的位置输入了一位字符,“4”代表最终有效密码位数符合要求的4位)。 在无数据时这个单元格显示为“—”。第二行是用来计算“位数”的:第二行每三个单元格为一组,代表一次输入、删除的操作组合(一个循环)。每个循环的第一个单元格(例如A2)代表输入字符的位数,第二个单元格(例如B2)代表点击删除键的次数,第三个单元格(例如C2)代表经过之前的操作,最终得到的实际有效输入位数。第三行是用来计算“字符”的:第三行也是每三个单元格为一组。根据第二行的计算结果,在第三行相应单元格内产生随机数字字符串和删除“”字符串,每个“”代表点击一次删除键。第四行是用来得到“位数”的。虽然第二行已经计算出了“位数”,但其数据散布在各个单元格内,第四行是将第二行的结果组合为一个字符串显示出来,这一行只有B4单元格有用。第五行是用来得到“字符”的。与第四行相似,将第三行的结果组合为一个字符串显示出来。根据设置,在尾部加入随机产生的干扰字符串。这一行只有B5单元格有用。第七行至第九行,是用来保存第三行至第五行的结果的。如前述,第三行至第五行的结果是随机计算的,在excle内的任何操作都会导致其结果发生改变,为了将某个结果保存下来,需在得到符合要求的密码后,选中第三行至第五行,进行“复制”,并通过“选择性粘贴”功能,以“数据”形式粘贴为不含公式的纯数据进行保存。第十一行以后的J列和K列,是用来“显示密码”的。在K列单元格内输入任意字符,J列相应位置就会显示“1位”密码,随着后续各行输入,之前各行的密码会消失,始终只显示一位。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
使用举例:
“计算密码”举例。在B1单元格输入“15”,在D1单元格输入“10”。表格自动计算出一组密码,当“尾数”显示为“1-14”时,就得到了一组“4位”密码(“-1”代表本来按删除键的位置输入了一个数据,所以是“-1”)。如下图:
“保存密码”举例。选中图中第三行至第五行,右键“复制”,再选中第七行至第九行,右键选择“选择性粘贴”—“数值”,确定后将计算结果保存为固定文本。提示:B8和B9单元格内的数据就是密码,这对儿数据是整个表格中需要记录下来的唯一内容。
“显示密码”举例。将第三行至第五行的数据以文本形式粘贴到第七至第九行之后,可依次在K列第十二行及以下各行的单元格中输入任意字符,J列会同时在输入的最末行显示“1”位密码,其余行不显示。注:“显示密码”功能使用第七行至第八行的数据,所以`使用前需先确保第七行至第八行的内容是正确的;显示密码前可在J1单元格输入“冗位”(如下图为“3”);如前文对J1单元格的说明,这个“冗位”也可以不输入。
“返回密码”举例。删除B1和D1单元格的内容,然后在F1单元格中输入“位号”数据、在H1单元格输入“字符”数据,就会在第二行至第五行计算出与原结果一样的“密码”。之后,可以“复制”第三行至第五行,并用“选择性粘贴”—“数值”粘贴功能将其粘贴到第七行至第九行,以便重新“显示密码”。提示: 即使没有excel,其实只要知道“位号”各位数字的含义,是可以手工将“位号”和“字符”合并为原密码的(可合并出有用的部分,干扰部分则不必理会),所以不用担心原密码算不出来。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
上述表格的制作:
说明:
我在手机上下载某电子表格软件测试时,发现其CONCAT()函数尚未开发完整,暂不可用,下面列出的公式中使用了CONCAT()函数,所以在手机上可能无法正常计算;如果在手机上使用,可以用CONCATENATE()函数勉强替代,但是比较繁琐而且比较容易出错,使用CONCATENATE()函数修改后的公式列在本文后部)。
1.设置列宽。在一个新工作表内,选中A列至BH列,选中后点击右键,将其“列宽”设置为“4字符”,使显示效果好一些。在设置单元格格式时,图中例子使用了两种颜色进行图案填充,下文称为“第一种颜色”和“第二种颜色”
2.输入第一行的内容:如前各图,在A1内输入“循环”,C1输入“扰位”……其他略。在L1单元格内输入公式,“回车”确认:
=IF($B$1="",IF($F$1="","-",CONCAT(OFFSET($A$2,0,LEN($F$1)-1-3,1,3))),CONCAT(OFFSET($A$2,0,$B$1*3-3,1,3)))
进一步可以选中第一行A列至BH列单元格,使用“右键”—“设置单元格格式”功能将其“图案”设置为第一种颜色、设置全部“边框”、“水平对齐”设置为居中。
3.输入第二行的内容:在A2单元格内输入公式,“回车”确认:
=IF($B$1="",IF($F$1="","",IF(COLUMN()$B$1*3,"",IF(COLUMN()=$B$1*3-1,-1,IF(MOD(COLUMN(),3)=0,IF(COLUMN()=3,MAX(0,$A$2-$B$2),MAX(0,OFFSET(A2,0,-3)+OFFSET(A2,0,-2)-OFFSET(A2,0,-1))),IF(MOD(COLUMN(),3)=2,RANDBETWEEN(1,IF(COLUMN()/3