语音令人难忘的密码生成algorithm

背景

那天在健身房的时候,我正在用我的组合锁,并且认识到一些对我来说是个有用的程序员。 换句话说,我的组合是三个独立的数字组合,或者是相似的,或者是有其他的关系使得它们易于记忆。 例如,5-15-25,7-17-2,6-24-5。 这些例子似乎很容易记住。

我将如何执行类似的密码? 是的,他们应该很难破解,但最终用户也应该很容易记住。 组合锁可以用混合的数字混合在一起,这些数字具有相似的声音,并且具有相似属性的数字(7-17-23:全部素数,7在7之后滚动,23是另一个素数,并且是那套),“难”记得)。

标准

  • 密码应该很容易记住。 Dog!Wolf很容易记住,但一旦攻击者知道你的网站给出了这种组合,这使得检查变得容易得多。
  • 文字或字母大多应遵循相同的声音(大部分)。
  • 至less8个字母
  • 不使用!@#$%^&*();'{}_+<>?,./这些标点符号适用于'硬'密码,没有'易记'的声音。

资源

这个问题是语言不可知的,但是如果C#有一个特定的实现,我很乐意听到它。

更新

有less数用户表示“这是不好的密码安全性”。 不要以为这是一个网站。 这可能只是为了让我自己根据这些规则生成密码的应用程序。 这是一个例子。

字母ACCLIMOP 'stream',恰好是两个常用字( AcclimateMop )组合在一起。 此外,当用户这些字母,或者说他们是一个字,这是他们的一个真正的字。 很容易记住,但很难破解(显然,字典攻击)。

这个问题有两个部分的目标:

  1. 从听起来类似的字母构造密码(使用一致性)或
  2. 构造与普通单词相关的密码,类似于生成不在字典中的第三组字母。

你可能想看看:

  • 口令生成algorithm使用的apg和在FIPS-181中解释
  • Koremutake

首先确保密码很长。 考虑使用“密码短语”而不是单个“密码词”。 打破“狗与狼相互仇恨”的口头禅。 是非常困难的,但他们很容易记住。

一些网站也可能会给你一个build议,可能是有用的,如强密码:如何创build和使用它们 (链接从密码检查器 ,这是一个有用的工具本身)。

此外,与其尝试创build易于记忆的密码,在某些情况下,更好的select是通过使用(并教育用户使用)一个好的密码pipe理实用程序来避免记住密码(请参阅您最喜欢的密​​码存储工具? ) – 当这样做的时候,唯一剩下的部分是创build一个难以破解的密码,这很容易(任何足够长的随机句子)。

您可以使用马尔可夫链来生成听起来像英语(或任何其他语言),但他们不是真正的单词。

容易记住的问题真的是主观的,所以我不认为你可以写一个这样的algorithm,这将是每个人都好。

为什么在网站/计算机应用程序中使用短密码而不是通行短语? 他们很容易记住,但很难破解。

我很惊讶没有人提到http://www.multicians.org/thvv/gpw.html上描述的Multicsalgorithm,它与FIPSalgorithm相似,但基于三元组而不是有向图。; 它产生的输出如

 ahmouryleg thasylecta tronicatic terstabble 

我也将代码移植到python: http : //pastebin.com/f6a10de7b

多年以后,我决定在密码中使用第一个字母的单词。 这是不可能的,破解,多function的长度和限制,如“你必须有一个数字”,很难犯错误。

这通过创build一个短语来工作。 一个疯狂的乐趣生动的话题是有用的! “堆栈溢出外星人降落时不使用火箭或轮子”。 拿第一个字母,你的密码是“soalwurow”

你可以快速准确地input,因为你不是一个又一个记住字母,你只是在头脑里说一个句子。

我也喜欢在键盘的左右两边交替使用单词,这样可以提高打字速度和节奏。 注意在我的例子中,你的双手交替左右,左右。

我有几次使用以下algorithm:

  1. 将所有小写元音(从az)放入数组元音中
  2. 把所有的小写辅音(从az)放入另一个辅音字母
  3. 以这种方式创build第三个数组的两个字母,即创build元音辅音之间所有可能的字母对(“ab”,“ba”,“ac”等…)
  4. 随机从对中挑选3-5个元素并将它们连接在一起作为stringPassword
  5. 随机selecttruefalse
    1. 如果为true ,则删除密码的最后一个字母
    2. 如果是false ,不要做任何事情
  6. 用大写字母replace密码中的 2-4个随机select的字符
  7. 用随机select的整数0-9replace2-4个随机select的密码字符

Voilá – 现在你应该有一个长度在5到10个字符之间的密码,大写和小写字母数字字符。 元音和辅音轮stream经常使他们半音,因此更容易记住。

FWIW我很喜欢简单但基本上是随机的密码。 以“Bongo”作为随机单词。 交换你得到的“Gobong”的音节。 顶部(或其他一些常见的替代)交换0的零,你有一个基本上随机的字符序列与一些线索,可以帮助你记住它。

现在,你如何以编程的方式挑出音节 – 这是另外一个问题!

当您为用户生成密码并通过电子邮件发送密码时,如果强制他们更改密码,首次login时应该做的第一件事情。 由系统创build的密码不需要很容易记住,因为它们应该只需要一次。

很容易记住,很难猜测密码对于用户来说是一个有用的概念,但并不是系统应该以某种方式执行的。 假设您向用户的Gmail帐户发送密码,并且用户在login后不更改密码。如果gmail帐户的密码被泄露,则系统密码将受到损害。

因此,如果用户必须立即更改密码,那么为您的用户生成容易记住的密码是没有用的。 如果他们不立即改变它,你还有其他问题。

我更喜欢给用户一个“硬”的密码,要求他们在第一次使用时改变它,并且给他们指导如何构build一个好的长通行证。 我也将这个与合理的密码复杂度要求(8个字符,大/小写混合,标点符号或数字)结合起来。 我的理由是,人们更有可能记住他们自己select的东西,如果他们能记住的话,他们不太可能把它写下来。

“密语”思想的一个自旋是采取一个短语,并写出短语中每个单词的第一个字母。 例如

 "A specter is haunting Europe - the specter of communism." 

 asihe-tsoc 

如果这个短语碰巧有标点符号,比如!,?等等 – 不妨把它推到那里。 数字也一样,或者只是replace字母,或者添加相关的数字到最后。 例如马克思(他说这句话)在1883年去世了,为什么不“asihe-tsoc83”呢?

我敢肯定,一场创造性的暴力攻击可以利用这种密码的统计属性,但它仍然比字典式攻击更安全。


另一个伟大的方法就是弥补荒谬的话,如“Barangamop”。 使用它几次后,你会把它记忆,但很难暴力。 附加一些数字或标点符号以增加安全性,例如'386Barangamop!'

这是你的想法在shell脚本原型的第2部分。 它从您的计算机上的Unix字典文件需要4,5和6个字母的单词(大约50,000),并将这些单词连接在第一个字符上。

 #! /bin/bash RANDOM=$$ WORDSFILE=./simple-words DICTFILE=/usr/share/dict/words grep -ve '[^az]' ${DICTFILE} | grep -Ee '^.{4,6}$' > ${WORDSFILE} N_WORDS=$(wc -l < ${WORDSFILE}) for i in $(seq 1 20); do password="" while [ ! "${#password}" -ge 8 ] || grep -qe"^${password}$" ${DICTFILE}; do while [ -z "${password}" ]; do password="$(sed -ne "$(( (150 * $RANDOM) % $N_WORDS + 1))p" ${WORDSFILE})" builtfrom="${password}" done word="$(sort -R ${WORDSFILE} | grep -m 1 -e "^..*${password:0:1}")" builtfrom="${word} ${builtfrom}" password="${word%${password:0:1}*}${password}" done echo "${password} (${builtfrom})" done 

像大多数密码生成器一样,我通过在二十几岁时输出它们而作弊。 这通常是以“安全”(有人盯着你的肩膀)的方式来捍卫的,但真的只是让用户select最友好的密码而已。

我发现字典文件中的4到6个字母的单词仍含有不明确的单词。

更好的文字来源是书面文件。 我复制了这个页面上的所有单词,并将它们粘贴到一个文本文档中,然后运行下面的一组命令来获取实际的英文单词。

 perl -pe 's/[^az]+/\n/gi' ./624425.txt | tr AZ az | sort -u > ./words ispell -l ./words | grep -Fvf - ./words > ./simple-words 

然后,我使用这个500页左右这个非常简单的单词,用shell脚本生成以下密码 – 脚本括号显示组成密码的单词。

 backgroundied (background died) soundecrazy (sounding decided crazy) aboupper (about upper) commusers (community users) reprogrammer (replacing programmer) alliterafter (alliteration after) actualetter (actual letter) statisticrhythm (statistical crazy rhythm) othereplacing (other replacing) enjumbling (enjoying jumbling) feedbacombination (feedback combination) rinstead (right instead) unbelievabut (unbelievably but) createdogso (created dogs so) apphours (applications phrase hours) chainsoftwas (chains software was) compupper (computer upper) withomepage (without homepage) welcomputer (welcome computer) choosome (choose some) 

其中一些结果是赢家。

原型显示它可能已经完成了,但是你所需要的关于双音节或者音节信息的智能需要比单词更好的数据源。 你需要发音信息。 另外,我已经向你展示了你可能想要一个简单的单词数据库来select,而不是所有的单词,以更好地满足你难忘的密码要求。

第一次和每次生成一个单一的密码 – 你需要的networking – 将采取更好的数据源和更复杂。 使用比Bash更好的编程语言,使用文本文件和使用数据库可以使其即时运行。 使用数据库系统,你可以使用SOUNDEXalgorithm,或者其他的。

整洁的想法。 祝你好运。

我完全用rjh。 使用密码开头字母的好处在于它看起来是随机的,如果你不知道它背后的短语,这使得它很难记住,以防万一你在键入密码时看到你的肩膀。
OTOH,如果她看到你键入8个字符,其中有两个,然后是'o'和'r',她可能会在第一时间正确地猜出它。
强制使用至less一位数字并没有什么帮助; 你只知道它会是“pa55word”或“passw0rd”。

歌词是口头禅的不竭来源。

 "But I should have known this right from the start" 

成为“bishktrfts”。 10个字母,甚至只有小写字母给你10 ^ 15的组合,这是很多 ,特别是因为没有捷径来破解它。 (每秒100万组合,需要30年的时间来testing所有的10 ^ 15个组合。)
作为一个额外的(如果伊娃知道你是一个警方的粉丝),你可以交换例如第二和第三个字母,或采取第三个字的第二个字母。 无限可能。

系统生成的密码对于除内部服务帐户或临时重置(等)之外的任何内容都是一个坏主意。

你应该总是使用你自己的“密码短语”,这些密码很容易记住,但是几乎不可能猜到或蛮力。 例如,我的旧大学帐户的密码是。

Here to study again!

这是20个字符使用大写和小写的标点符号。 这是一个令人难以置信的强大的密码,没有一个软件可以生成一个更安全的,更容易记住我的。

看看gpw工具 。 该软件包也可以在Debian / Ubuntu软件库中find。

生成“听起来像”字样的密码的一种方法是使用马尔可夫链。 一个n阶马尔可夫链基本上是一个大的n元组集,出现在你的input语料库中,以及它们的频率。 例如,具有二阶马尔可夫链的“aardvark”将生成元组(a,a,1),(a,r,2),(r,d,1),(d,v,1) ,(v,a,1),(r,k,1)。 或者,您还可以包含“虚拟”开始词和结束词标记。

为了创build一个有用的马尔可夫链,你需要input大量的英语数据 – 有很多可用的数据,包括古登堡计划(Project Gutenburg) – 可以生成上面列出的一系列logging。 为了生成至less大部分遵循语法或组成的规则的自然语言单词或句子,通常3阶马尔可夫链是足够的。

然后,为了生成一个密码,你从集合中随机select一个“起始”元组,并按其频率进行加权,然后输出第一个字母。 然后,重复随机select一个“下一个”元组(也就是按频率加权),也就是说,以当前字母相同的字母开始,只有一个字母不同。 使用上面的例子,假设我从(a,a,1)开始,输出'a'。 我唯一的select是(a,r,2),所以我输出另一个'a'。 现在我可以select(r,d,1)或(r,k,1),所以我根据它们的出现频率随机选取一个。 假设我select(r,k,1) – 我输出'r'。 这个过程一直持续下去,直到你到达一个单词末尾的标记,或者决定独立地停止(因为大多数马尔可夫链形成一个循环图,如果你不使用假长度限制,你永远不会完成生成)。

在单词级别(例如,元组的每个元素是一个单词),这种技术被一些“对话机器人”用来产生明智的看似无意义的句子。 它也被垃圾邮件发送者用来试图逃避垃圾邮件filter。 如上所述,在字母级别上,可以用它来生成无意义的单词,在这种情况下用于密码。

一个缺点:如果您的input语料库不包含除字母以外的任何内容,也不会输出您的输出短语,所以他们不会通过最安全的密码要求。 您可能想要应用一些后处理来replace一些字符的数字或符号。

编辑:回答之后,我意识到这绝不是语音难忘的。 无论如何,离开答案B / C我觉得很有趣。 /编辑

老线程,我知道…但值得一试。

1)我可能会build立最大的字典,你可以ammass。 把它们按照词性组装成桶。

2)然后,build立一个可以做几种types句子的语法。 句型的“types”由词性的排列决定。

3)随机(或尽可能接近随机),select一种types的句子。 返回的是带有词性占位符的模式(nvn是名词 – 动词 – 名词)

3)在每个词类桶中随机挑选单词代替占位符。 把它们填满(上面的例子可能会变成像汽车一样的自行车)

4)随机扫描每个字符,决定是否要用相似的冠冕堂皇的字符(或字符集)或者相似的字符replace它。 这是这个问题最难的一步。

5)由此产生的密码将像kaR @ tebyCICle

6)嘲笑像“空手道自行车”那样的幽默效果,

我真的很想看到有人用“ <Ctrl>+N ”等控制字符或者像“ A+C ”这样的组合字符来实现密码。 把它转换成一些二进制等价的,恕我直言,使密码的要求更容易记住,input更快,更难破解(许多更多的组合来检查)。