刚进大学的时候,出于方便考虑,我做了一个汇总版本的个人信息表,后来也一直是我在更新维护。
这些信息很重要,稍有不慎、泄露出去,必将造成严重的后果。
但是最初汇总的时候,我并没有有考虑那么多。加上自己的谨慎保管,安全性还算可以保证。
然而,后来这个文件需要共享给其余8个班委,这个风险自然就翻番了……
怎么办呢?正常人应该都会想到——当然是加密啊!
没错,起初我也是这么干的,可后来一次无意间,我发现有人嫌麻烦、直接将我设置好的密码存在了文件名当中……
这样一来,密码不就形同虚设了吗?
不行不行,千万不能让这种事情发生!
正所谓需求就是生产力,看来我只能使出绝招了——动态密码(授权)!
方法很简单,就是调用 Excel 自带的 VBA 简易编程功能。
以最新版 Office 365 为例,新建并保存一个格式为.xlsm(启用宏的工作簿)
的 Excel 文档。
在 Excel 选项中找到信任中心
,打开信任中心设置
,然后选找到宏设置
。
由于不确定我们需要的 VBA 代码是否可以在有数字签名的状态下无障碍运行,为了保证制作过程不受限制,此处我们选择启用所有宏
。
这里需要两个工作簿,一个是咱们的信息表(名字随意),另一个是空白的,工作簿的名字必须是系统已锁定
,具体用途后面会介绍。
当然如果你想让锁定看起来更高大上一些,也可以在空白的工作簿里写点东西,比如像我这样:
是不是看起来很牛逼装逼的样子?
按下ALT+F11
打开 VBA 工程区,选中左侧的ThisWorkbook
,然后填入以下代码:
Private Sub hideAllSheets()
Dim wSheet As Worksheet
'将所有工作表设置为完全隐藏,只能用VBA恢复
For Each wSheet In Worksheets
If wSheet.Name <> "系统已锁定" Then wSheet.Visible = xlSheetVeryHidden
Next wSheet
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Call hideAllSheets
End Sub
Private Sub Workbook_Open()
Dim wSheet As Worksheet, pwd As String, s As String
'禁用Ctrl+Pause键,以免用户强制中断VBA程序的运行
Application.EnableCancelKey = xlDisabled
'为防止上次打开该文件时禁用宏,以致工作表未隐藏,每次打开时都执行一遍隐藏操作
Call hideAllSheets
'生成密码,即基于当日日期的变体
pwd = "ABCabc" & Month(Now()) * 20 + Day(Now()) * 19
'循环要求用户输入密码,直到相符为止
s = ""
Do While s <> pwd
s = InputBox("请输入密码:", "系统登录", vbOK)
Loop
'将所有工作表取消隐藏,设置为可见
For Each wSheet In Worksheets
wSheet.Visible = xlSheetVisible
Next wSheet
'恢复Ctrl+Pause键
Application.EnableCancelKey = xlenabled
End Sub
此处的密码算法是"ABCabc" & Month(Now()) * 20 + Day(Now()) * 19
,其中:
&
表示直接连接+
表示进行加法运算所以密码就是ABCabc
与月份*20+日期*19
连接起来的一串字符。
以2019年9月6日为例,就是ABCabc294
。
当然,你也可以使用Year()
等函数得到更加强大的密码算法,可以自己探索一下。
最后我们保存并关闭文件,再打开的时候,就会出现密码输入的提示框了,就像这样
这样一来,只要保证密码算法无人知晓,就可以实现类似于“动态授权”的密码方式了。
不过其实这样还是存在不足的:
.xlsm
这样的格式似乎只在电脑上能够得到支持,会造成使用不便;在文件共享出去之前,我还是犹豫许久,并换回了普通的加密方式。
一来,是因为上面提到的不足;
另外就是,这个逼装得也太大了吧!