语音难忘的密码生成算法

时间:2009-03-08 22:19:08

标签: algorithm security language-agnostic passwords

背景

前几天在健身房,我正在使用我的密码锁,并意识到一些对我作为程序员有用的东西。也就是说,我的组合是三个单独的数字组合,听起来相似,或者有一些其他关系,使它们易于记忆。例如,5-15-25,7-17-2,6-24-5。这些示例似乎易于记忆。

问题

我如何实现类似的密码?是的,它们应该很难破解,但它们也应该很容易让最终用户记住。组合锁使用具有相似声音的数字混合,并且具有相似属性的数字(7-17-23:所有Prime,17在7之后从舌头滚动,23是另一个素数,并且是(out)那套),“难以记住的”。

标准

  • 密码应易于记忆。 Dog!Wolf很容易记住,但一旦攻击者知道您的网站发布了这种组合,就会让检查变得更容易。
  • 这些单词或字母应该大部分都遵循相同的声音(大部分)。
  • 至少8个字母
  • 不使用!@#$%^&*();'{}_+<>?,./这些标点符号虽然适用于“硬”密码,但却没有“易于记忆”的声音。

资源

这个问题与语言无关,但如果有一个特定的C#实现,我会很高兴听到它。

更新

一些用户说'这是错误的密码安全'。 不要假设这是针对网站的。这可能只是让我为自己制作一个根据这些规则生成密码的应用程序。这是一个例子。

  

这些信件   的 A - C - C - - 的 I - 的中号< / strong> - O - P 'flow',它们碰巧是两个   常用词放在一起   (适应拖把)。进一步,   当用户这些字母时,或   他们说一句话,这是一个实际的   对他们来说。容易记住,但是   难以破解(字典攻击,   很明显)。

这个问题有两个部分:

  1. 使用听起来相似(使用头韵)或
  2. 的字母构造密码
  3. 构造用于对常用单词进行网格化的密码,以生成不在字典中的第三组字母。

17 个答案:

答案 0 :(得分:30)

您可能需要查看:

答案 1 :(得分:19)

首先确保密码很长。考虑使用“密码短语”而不是单个“密码”。打破诸如“狗与狼之间的仇恨”之类的通行语。非常难,但它们很容易记住。

有些网站也可能会向您提供可能有用的建议,例如Strong passwords: How to create and use them(从Password checker链接,这本身就是一个有用的工具)。

此外,不是试图创建易于记忆的密码,在某些情况下,更好的选择是通过使用(并教育用户使用)良好的密码管理实用程序来避免记住密码(参见{{3 }) - 当这样做时,剩下的唯一部分是创建一个难以破解的密码,这很容易(任何足够长的随机句子都可以)。

答案 2 :(得分:11)

您可以使用Markov Chains生成听起来像英语(或您想要的任何其他语言)的单词,但它们不是真正的单词。

容易记住的问题是非常主观的,所以我认为你不能写出这样一个对每个人都有好处的算法。

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

答案 3 :(得分:11)

我很惊讶没有人提到http://www.multicians.org/thvv/gpw.html中描述的Multics算法,它类似于FIPS算法但是基于三字形而不是有向图。它产生输出,如

ahmouryleg
thasylecta
tronicatic
terstabble

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

答案 4 :(得分:8)

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

这可以通过创建一个短语来实现。一个疯狂有趣的生动话题很有用! “Stack Overflow外星人在没有使用火箭或轮子的情况下降落”。 拿第一个字母,你的密码是“soalwurow”

你可以输入快速准确,因为你不记得一个字母,你只是在脑海里说一句话。

我也喜欢在键盘的左右两侧交替使用单词,它可以让您的打字速度更快,节奏也更令人愉悦。请注意,在我的示例中,您的手左右 - 左 - 右交替。

答案 5 :(得分:6)

我有几次使用以下算法:

  1. 将所有小写元音(从a-z)放入数组元音
  2. 将所有小写辅音(从a-z)放入另一个数组辅音
  3. 以这种方式创建两个字母的第三个数组 Pairs ,您可以在元音辅音之间创建所有可能的字母对( “ab”,“ba”,“ac”等......)
  4. Pairs 中随机选择3-5个元素并将它们连接在一起作为字符串密码
  5. 随机选择truefalse
    1. 如果true,请删除密码
    2. 中的最后一个字母
    3. 如果false,则不要做任何事情
  6. 密码替换2-4个随机选择的字符及其大写等值
  7. 使用随机选择的整数0-9
  8. 替换密码中随机选择的2-4个字符

    Voilá - 现在您应该拥有一个长度在5到10个字符之间的密码,并带有大写和小写字母数字字符。元音和辅音轮流经常使它们半发音,因此更容易记住。

答案 6 :(得分:5)

FWIW我非常喜欢用简单但基本上随机的密码来翻译单词音节。以“Bongo”为例,作为一个随机词。交换你得到“Gobong”的音节。将o替换为顶部的零(或其他一些常见的替换),你有一个基本上随机的字符序列,有一些跟踪可以帮助你记住它。

现在你如何以编程方式挑选音节 - 这是另一个问题!

答案 7 :(得分:4)

当您为用户生成密码并通过电子邮件发送密码时,首次登录时应该首先强制他们更改密码。系统创建的密码不需要易于记忆,因为它们只需要一次。

易于记忆,难以猜测密码对于您的用户来说是一个有用的概念,但不是系统应该以某种方式强制执行的概念。假设您向用户的Gmail帐户发送密码,并且用户在登录后没有更改密码。如果gmail帐户的密码遭到破坏,则系统密码将受到损害。

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

答案 8 :(得分:3)

我更喜欢给用户一个“硬”密码,要求他们在第一次使用时更改密码,并为他们提供如何构建一个好的长密码短语的指导。我还要将其与合理的密码复杂性要求(8个字符,大小写混合,标点符号或数字)相结合。我的理由是,人们更容易记住他们自己选择的东西,如果他们能记住的话就不太可能把它写下来。

答案 9 :(得分:3)

旋转'密码短语'的想法是使用短语并在短语中写下每个单词的第一个字母。 E.g。

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

变为

asihe-tsoc

如果这个短语恰好有标点符号,例如!,?等,那么也可以把它推到那里。数字相同,或者只是替换字母,或者在末尾添加相关数字。例如。卡尔马克思(他说这句话)于1883年去世,为什么不'asihe-tsoc83'?

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


另一个很好的方法就是制作荒谬的词汇,例如: 'Barangamop'。使用它几次之后你会把它归于记忆,但是很难暴力。添加一些数字或标点符号以增加安全性,例如: '386Barangamop!

答案 10 :(得分:2)

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

#! /bin/bash

RANDOM=$$
WORDSFILE=./simple-words
DICTFILE=/usr/share/dict/words
grep -ve '[^a-z]' ${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

像大多数密码生成器一样,我通过输出二十多岁来作弊。这通常是在“安全性”(有人看着你的肩膀)方面进行辩护,但实际上只是让用户选择最友好的密码。

我发现字典文件中的4到6个字母单词仍然包含晦涩的单词。

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

perl -pe 's/[^a-z]+/\n/gi' ./624425.txt | tr A-Z a-z | 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)

其中一些结果是胜利者。

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

第一次和每次生成一个密码 - 您需要的Web - 将获得更好的数据源和更复杂的信息。使用比Bash更好的编程语言和文本文件并使用数据库可以使其立即生效。使用数据库系统,您可以使用SOUNDEX算法,或者其他一些算法。

干净的想法。祝你好运。

答案 11 :(得分:2)

我完全和rjh在一起。使用密码短语的起始字母的优点是它看起来是随机的,这使得如果你不知道它背后的短语就很难记住,以防你在输入密码时看着你的肩膀。
OTOH,如果她看到你输入大约8个字符,其中's'两次,然后'o'和'r',她可能第一次正确猜测。
强制使用至少一个数字并没有多大帮助;你只需知道它将是“pa55word”或“passw0rd”。

歌词是取消短语的取之不尽的源泉。

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

成为“bishktrfts”。 10个字母,甚至只有小写字母给你10 ^ 15个组合,这是很多,特别是因为没有破解它的捷径。 (每秒100万次组合需要30年才能测试所有10 ^ 15种组合。)
作为额外的(如果Eve知道你是警察的粉丝),你可以交换,例如第二个和第三个字母,或者取第三个字母的第二个字母。无尽的可能性。

答案 12 :(得分:1)

编辑:回答之后,我意识到这绝不是发音上令人难忘的。无论如何离开答案b / c我发现它很有趣。 /编辑

旧线程,我知道......但值得一试。

1)我可能会建立一个最大的字典,你可以ammass。通过部分演讲将它们安排到桶中。

2)然后,构建一个可以制作几种句子的语法。句子的“类型”由词性的排列决定。

3)随机(或尽可能接近随机),选择一种句子。返回的是具有词性占位符的模式(n-v-n将是名词 - 动词 - 名词)

3)在每个词性桶中随机选取单词以代替占位符。填写它们。(上面的例子可能会像汽车自行车一样。)

4)随机扫描每个字符,决定是否要用类似声音的字符(或一组字符)替换它,或者看起来相似。这是问题中最艰难的一步。

5)结果密码类似于kaR @ tebyCICle

6)嘲笑上面看起来像“空手道自行车”的幽默结果

答案 13 :(得分:1)

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

为了为您的目的创建一个有用的马尔可夫链,您将输入大量的英语语料数据 - 有许多可用的,包括,例如,Project Gutenburg - 来生成如上所述的一组记录。为了生成至少大部分遵循语法或构成规则的自然语言单词或句子,三度马尔可夫链通常就足够了。

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

在单词级别(例如,元组的每个元素都是单词),某些“会话机器人”使用此技术来生成看似无意义的句子。它也被垃圾邮件发送者用来试图逃避垃圾邮件过滤器。在字母级别,如上所述,它可用于生成无意义的单词,在本例中为密码。

一个缺点:如果您的输入语料库不包含除字母以外的任何内容,也不会包含输出短语,因此它们不会传递大多数“安全”密码要求。您可能希望应用一些后处理来替换某些字符的数字或符号。

答案 14 :(得分:1)

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

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

  

Here to study again!

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

答案 15 :(得分:1)

看看gpw tool。该软件包也可以在Debian / Ubuntu存储库中使用。

答案 16 :(得分:0)

我真的喜欢看到有人用“<Ctrl>+N”这样的控制字符实现密码,或者甚至同时使用“A+C”这样的组合字符。将此转换为某些二进制等价物,恕我直言,会使密码要求更容易记住,更快打字,更难破解(更多组合要检查)。