假设我的 iPhone 上有一个加密文件,每次我想要解密它时,我都想“绘制”一个解密符号,而不必使用键盘来输入它。

如果您要求用户在每次需要时绘制一个符号来解密文件(例如每次他们启动您的应用程序时)他们可能更喜欢在小键盘上输入 20 个字符左右的密码,并且他们仍然可以获得 20 个字符的密码所能提供的安全性(取决于形状/符号的复杂程度)他们画的是)。

他们绘制的符号很可能是一笔(例如一旦你抬起手指就结束了)但可能非常复杂,以至于其他人很难重复它,即使他们确实看到你把它画进去。有点像每个人的签名都是独一无二且难以复制的。实际上,如果必须防止重复,这可能会使事情变得过于复杂,所以现在可以忽略这一点,我们可以假设该符号不会被其他人看到,因此是否可以重复并不重要由他们或不由他们。

我想真正的问题是如何将相同的(合理的)笔划一致地转换为相同的键(例如哈希值)。显然,算法中应该存在一些容错阈值,因为不能期望用户 100% 精确地重复笔画。

使用符号作为解密方法给这个问题增加了一个全新的维度。您永远不想以未加密的形式将生成的哈希值存储在任何地方,因为这样有人可能能够访问硬盘驱动器的该部分并获取解密密钥,而无需完成整个绘图过程并手动解密文件。您也很可能不想存储有关如何绘制形状的任何信息。

用户可以用作解密符号的笔划的一个很好的例子是“&”符号。想象一下,用户每次需要解密文件时,都会在 iPhone 上绘制此符号。每次绘制符号的大小可能并不相同。此外,符号的旋转可能会有所不同,具体取决于用户握持设备的方式。理想情况下,在这两种情况下,因为绘制的符号相对于用户笔画是相同的,所以应该能够生成相同的哈希值,从而解密文件。

我认为形状或字符识别之类的算法是类似的。用户绘制一些东西(合理地表示一个形状),然后将其修复为正确的形状,每次绘制时该形状都会具有相同的哈希值。然而,对于这样的事情,您很可能需要一个可以绘制的形状数据库,如果您选择字母表中的所有字母之类的东西,您只会得到 26 个字母。假设用户只需要绘制一个符号即可解密文件,那么您的密码就非常不安全,只有 26 种可能性。

我想到的另一件事是,您可以将绘制成小段的符号分解,然后对它们运行符号识别。假设数据库中有 4 个符号:垂直线、水平线和两个方向的对角线。现在,当用户绘制时,每个段都被识别为其中之一,然后它们全部组合起来形成一些哈希值。因此,想象一下用户选择小写字母“r”作为解密符号。因此,他们首先画一条向下的垂直线,然后画一条向上的垂直线,然后画一条向上和向右的对角线。此方法的一个问题是您如何知道何时将笔画分割成单独的片段?您可能还想考虑每个单独片段的大致长度(例如以 40 像素为增量)。这样,如果有人画了一个变形的“r”,其中驼峰出现在底部附近,它就不会被识别为相同的符号,因此不会解密文件。

第三种方法可能是将屏幕划分为网格(尚不确定大小),然后简单地查看在哪些单元格中绘制了笔划,并以某种方式使用该数据来生成字符串。

关于如何实现这一点还有其他想法吗?你听说过这样的事情吗?是否有任何根本缺陷会阻止这样的系统运行?

谢谢

有帮助吗?

解决方案

使用可能具有小错误的关键材料加密数据的问题已经被广泛研究。 特别地,存在许多使用生物测定数据(例如指纹或视网膜扫描)作为关键来保护数据的提议。一种典型的方法是使用适当的纠错码,获取原始密钥材料K,计算其综合症并仅存储综合症。一旦你获得了你的关键材料K'的第二次读数,如果K和K'足够接近(其中'足够接近'当然取决于纠错方案),该综合症可用于从K'恢复K.)

为了帮助你入门,这篇论文提出了一个模糊保险库计划。这是使用“模糊”的加密方案的一般提议。键。当然,您仍然需要检查如何从足够稳定的图形中提取特征以使用这种纠错方案。您还必须检查可以从这些图纸中提取多少熵。密码就像熵一样糟糕,它们可能仍然很难被击败。

其他提示

我会尝试分段变体的变体:识别简单的图案 - 为此我将坚持使用直线和对角线,但理论上您也可以添加圆形、弧线和其他东西。

您可以非常确定一行何时结束,另一行何时开始,因为有 8 个方向,并且您可以检测方向变化(或者对于更简单的方法,只需检测提笔和落笔并将它们用作行分隔符)。第一行给出了比例因子,因此每隔一条线的长度可以表示为一个因子(例如,在通常的 L 形状中,第一条垂直线将给出“基本长度”b,然后另一条线将具有长度大约为0.5*b)。用户完成后,您可以使用最小因子 s 对长度进行“四舍五入”,这样您将拥有一个整数长度数组,例如 [1 * s, 2 * s, 4 * s, 5 * s]。这将防止系统过于精确,并且使用基本长度使系统对缩放具有鲁棒性。

现在以某种方式将这些信息(长度和方向)转换为字符串(或哈希值,无论你喜欢什么),即使符号被平移或缩放,对于相同的笔画它也是相同的。

此外,您可以为第二行之后的每一行存储一个 2D 偏移值(当然也是“四舍五入”),这样这些行也必须位于相同的位置,如果您不这样做,L 和 T很可能会得到相同的字符串(上下 1 行,左右 1 行长度 0.5)。因此,存储位置稍微加强了整个事情,但它是可选的。

编辑:

如果将第一条线的角度作为底角,甚至可以使其对旋转具有鲁棒性。

请注意,如果所有线都具有相同的长度,则该算法仅为每个笔划提供 3 位,并且每个笔划最多可能为 6-8 位,如果您还存储位置,则可能会更多。这意味着您需要一个大约 20-40 笔画的相当复杂的符​​号才能获得 128 位的安全性。

添加更多变化/安全性的一个简单方法是让用户使用给定调色板中的不同颜色。

为了降低别人监视您的风险,您可以使每条线在绘制后消失,或者将颜色更改为与背景对比度非常低的颜色。

手写识别通常会考虑笔划的持续时间而不是实际长度等。

虽然它与压力敏感性有关,但我认为你可能会看到一些与你在想的相似的概念位...... jdadesign.net/safelock/

这不是完全相同的主题,但它是目前最让人想到的事情。

我认为你不能得到足够的“比特”。从手绘符号执行安全加密。正如您所注意到的那样,您必须考虑到足够的污点,才能容忍绘图中的自然变化。换句话说,你必须丢弃笔画中的噪音,将它们平滑成可重复的信号。但是噪声(高熵)会产生更好的加密密钥。

这样想。如果您确实将手势分解为向上,向下,向左和向右的片段,则每个片段将代表2位信息。对于AES密钥,符号将需要64个这样的段。这是一个非常复杂的记忆手势。如果通过连续重复多个段(“右,右,右,......”)来简化它,则会产生一个糟糕的(可预测的,非随机的)密钥。

我有另一个想到这个。我不是一个comp-sci人,但会像这样的工作。

假设用任何符号或“模式”来表示。有人画画。您需要分析的唯一可行的事情是touchBegan,touchMoved和touchEnded事件中生成的模式中的所有点。

所以......让我们把生成的所有点,无论是100还是1,000,000,它都没关系。

将它们分成几组,根据需要分组。我假设的越多越好,但是对于这个例子,让我们将它们分成4组。对于100分,组1将包含点1> 1。如图25所示,组2包含26> 50等等。

对于每个组,使用所有点来计算平均位置。

如果将画布空间划分为网格,并将“平均位置”绘制到最近的坐标上,它可能会更好。

然后检查所有组之间的相对距离。所以在1,2 1,3 1,4 2,3 2,4 3,4之间。

您现在拥有尽可能多的不同点,以及有关这些点的信息以生成密钥。平均值和网格应该有助于平滑一些(如果不是全部的话)熵。

您可能需要让用户多次绘制他们的模式,并将每个组与之前尝试的组进行比较。这样,您就可以确定用户可以一致地绘制哪些组。它还具有培训用户绘制图案的额外好处。

我怀疑你拥有的点和群体越多,这就越准确。

事实上,我打算自己尝试一下。

如果您获取了笔划的所有x,y坐标并对它们执行了某种线性2路操作,该怎么办?然后你可以计算一个'近似'哈希值,如果在笔画在...之内计算的数字...比如你的近似值的10%,那么你授予访问权限。

这一切都取决于你试图阻止什么样的攻击。如果您想要完全加密,假设攻击者可以完全访问加密文件,那么您需要相当多的熵来实现相当程度的保护。假设您获得了正确的算法,那么您可以将两个输入的输入熵的功率(其上限是不同可能输入的数量)乘以密钥设置过程所花费的时间,除以攻击者拥有多少计算能力,并获得攻击者必须采取的时间来蛮力破解加密。

例如,类似于android的9单元图形解锁方法可能会让你获得大约16位的熵。让我们假设您使用5秒的CPU时间来计算加密密钥。然后使用普通PC,需要5 * 2 ** 16/20秒,或大约4.5小时才能破解。输入中的任何熵损失或密钥设置和加密的低效率都会很快降低到几分钟,更不用说是否使用了计算机集群。

坦率地说,这并不比仅仅以晦涩的文件格式存储文件并希望没有人想出来更好

scroll top