为什么我们不应该创建自己的安全方案?

我在这里看到了很多有关自定义加密和自定义安全机制的问题,尤其是关于密码哈希的问题。

考虑到这一点,我正在寻找具有以下属性的规范答案:


对于新手来说很容易理解。
清楚而明确地说明了为什么自己滚动是不好的主意。
提供了很多示例。

必填xkcd。

评论

供参考,D.W.在这里发布了一个很好的起点。

一对认为他们足够了解的人聚在一起,为无线网络创建了一种称为WEP的加密方案。您只需几分钟即可破解WEP加密。使用了“自己动手”的方法。阅读有关它,我只是想提醒您(您可能已经知道)。

@Everett-WEP是“自己滚”吗?事后看来,是的,它是薄弱且有缺陷的(很快就发现了攻击),但是它是由众多行业代表组成的一个联盟制定的标准。许多攻击都针对WEP的小密钥(以及小的重复IV)(部分原因是当时强加密在美国是非法的,以供出口)。 (我猜想这个行业会“自己滚开”,然后使用WPA和WPA2的WPS部分再次犯错了。)
@Ramhound我知道,我只是在问这个问题,以寻求答案。如果您能提供第二个答案来与jimbob博士竞争,那就太好了。

那不是安全方案,而是系统设计。安全方案是旨在解决单个安全问题的机制或一组机制。哈希方案,对称加密方案。您可以选择在系统设计中使用哪些方案,但绝对不要发明自己的安全方案。

#1 楼

您可以自己动手,但如果您不是安全性/密码学方面的专家,或者由多位专家对您的方案进行了分析,则可能会犯重大的安全错误。我更愿意赌一个开源的公开加密方案,供所有人查看和分析。与非专家内部开发的东西相比,更多的眼睛意味着当前版本没有重大漏洞的可能性。

Phil Zimmermann(PGP创作者)密码学简介(第54页) ):


70年代初我上大学时,我设计了一种我认为是出色的
加密方案。将一个简单的伪随机数流添加到
纯文本流中以创建密文。看来这将阻止对密文进行任何频率分析,即使对于情报最丰富的政府情报机构来说也无法破解。我对自己的成就感到很自满。

多年后,我在几本入门性密码学文本和教程论文中发现了相同的方案。多好。其他密码学家曾想到相同的方案。不幸的是,该方案是作为一个简单的作业分配而提出的,该作业是关于如何使用基本密码分析技术来琐碎破解的。


从我那卑鄙的经历中,我学到了在设计加密算法时容易陷入错误的安全感。大多数人没有意识到
设计一种能够经受足智多谋的对手长期而坚定的攻击的加密算法是多么困难。


(这个问题对上面的引用有更多讨论。)

如果您不相信“不要自己动手[密码学/安全性””,那么您可能不是专家,并且有很多您可能会犯的错误。

您的应用程序是否能够抵抗以下攻击:


计时攻击。例如,完全坏的密钥和部分坏的密钥在总计时间内花费相同的时间才能失败吗?否则,可以利用此时序信息来找到正确的密钥/密码。
娱乐性蛮力攻击;例如,这可以在几秒钟到几年内完成(当您担心它会在几年内损坏时)。也许您对安全性的想法可能是十亿分之一(1 000 000 000)闯入的机会(如果拥有僵尸网络的人尝试数十亿次,该怎么办?)。我的想法是希望达到2128分之一(34 000000000000000000000000000000000000000000000)的水平,这大约安全了1000亿倍,完全超出了猜测范围。 />并行攻击用户帐户;例如,您可以对数据库中的所有密码散列使用相同的(或更糟的是“盐”)散列密码,就像泄漏的LinkedIn散列一样。
简单地攻击任何特定帐户。也许每个唯一的哈希(例如MD5 / SHA1 / SHA2)密码都有一个独特的随机盐,但是由于您可以每秒在任意哈希上尝试数十亿个可能的密码,因此使用通用密码列表,字典攻击等可能攻击者只需几秒钟即可破解大多数帐户。使用诸如bcrypt或PBKDF2之类的强密码散列,可以通过适当的系数(通常为10(3-8))避免或增强常规散列。也许您使用的是microtime / MT-rand或信息太少,无法像几年前的Debian OpenSSL那样植入伪随机数。
攻击绕过保护措施。也许您在Web应用程序中进行了哈希/输入验证客户端,但是用户更改了脚本却绕过了这一点。或者,您具有客户端尝试在虚拟机中运行的本地应用程序,或者对其进行反汇编以对其进行反向工程/更改内存/或者以其他方式作弊。列表)CSRF,XSS,SQL注入,网络窃听,重播攻击,中间人攻击,缓冲区溢出等。最佳保护很快得到了总结。


CSRF:在POST操作中需要随机生成的CSRF令牌; XSS:始终先验证/转义不受信任的用户输入,然后再输入数据库并显示给用户/浏览器。
SQLi:始终使用绑定参数并限制返回多少结果。
窃听:加密敏感的网络流量。
重放:在每个事务中放置唯一的一次随机数。
MitM:信任的Web /与受信任的CA发布的上次访问站点/证书相同。
缓冲区溢出:安全的编程语言/库/可执行的空间保护/等)。





您只有最脆弱的可利用链接才强大。同样只是因为您没有制定自己的方案,也不意味着您的方案将是安全的,所以创建您所推出的产品的人很可能不是专家,或者创建了一个较弱的方案。

评论


我在初级编码人员中注意到的最大问题是,他们没有认真对待安全风险。如果我提到某些系统存在哪些弱点,那么常见的反应就是rolling绕……攻击是真实的,而且确实在发生,如果您甚至无法在学校中应用适当的安全性,那么您的应用程序应该如何应对呢?为数百位客户而活? :/说服他们的唯一方法通常是提供示例,最好是进行现场演示。因此,如果您有示例...我认为这将是一个不错的补充!

–吕克
2012年9月21日19:41



换句话说:一种方案只有在受到广泛攻击后才是安全的。

–很棒
15年7月16日在17:38



每个人,包括经验最丰富,数学精通的密码学家,都可以产生他们真正无法破解的加密算法。然后其他人看看它,找到了大象。

–惨败实验室
2015年12月11日,下午3:26

布鲁斯·施耐尔(Bruce Schneier)的文章为“业余密码设计师备忘”。强烈不鼓励使用自己的密码。但这自然导致人们认为,加密的所有事情都应由专家来完成,而其他人则只能观察他们在做什么。如果是这样的话,我想问为什么我们甚至应该花点时间看他们所做的一切,因为一切都以最好的方式得到了我们的照顾。专家们当然拥有广泛而深刻的知识,但是有一分钟尽管外行提示和问题的可能性不为零,但可以使专家的工作受益。

–沉莫功
16-4-10在14:27



@ Mok-KongShen,没有人说不要学习和使用加密思想。我们/他们说的是,不要依赖您的业余计划是安全的。如果您阅读Bruce Schneier的文章,您会发现他确实建议了一些积极的行动方案,而不仅仅是“交给专家”。例如,他建议您从密码分析开始,并打破现有的方案,而这些方案已经被破解而无需“偷看”答案。关键是要在发明新事物之前先熟悉一下存在的事物。这适用于许多领域。

–通配符
17年9月19日在0:48

#2 楼

我所在的区域有一栋房子,在第二层家庭房的外面有一个非常漂亮的甲板。它看起来膨胀,直到您进入下方并查看其构造方式。房主似乎认为他不需要向建筑商或建筑师付巨资来告诉他如何建造甲板。他自己动手建造,看起来像是2x4下方的混乱蜘蛛网。可能会没事的。就我个人而言,我宁愿不冒这样的业余建筑工作所带来的生命和危险。

我认为,如果您想开发一种进行加密的算法,则应该这样做并有一段美好的时光。它。我不建议您使用它来隐藏您的在线银行对帐单,但是如果您想在家用计算机上加密女朋友的情书,那应该没问题-只要您的妻子不是密码分析员即可。

那里是“美国黑匣子” *中有关海军发展自己的密码的故事。海军将对自己的新密码系统感到满意,而陆军分析师Yardley将立即破解密码,解释他们做错了什么。他们愿意提供修复代码的方法,但是Yardley指出,尽管他们可以解决特定的弱点,但缺乏扎实的了解,但他们总是会遇到问题。他们的系统本质上是有缺陷的。这有点像修补漏水的屋顶。您可以永久修补,但水仍会渗入。如果您不想弄湿,则需要由对屋顶了解甚多的人来建造屋顶。

我是否曾经告诉过您我对已故的岳母进行的自行脑部手术?一切顺利,直到她去世了。认真地说,我们当中很少有人会相信我们的健康可以依靠业余医生。您真的要相信业余软件的秘密吗?
我不愿承认,但我每隔几个月就要买一张彩票。我完全希望输掉比赛,但潜在的支出是巨大的。我可以发挥几率,也许我会领先。如果我不这样做,那我就赔钱了。为什么要在加密方面发挥作用呢?

,/鲍勃·布赖恩(Bob Bryan)



推荐:赫伯特·O·雅德利(Herbert O. Yardley),“美国黑匣子”-一本有趣的书今天,就像它在1931年撰写时一样。这是1932年畅销书,无论是在国内还是在国外。”来自国家安全局(NSA):珍珠港评论-黑室



评论


因此,基本上,您说的是不必担心安全性,因为他可以将安全性交到其他了解安全性的人手中。因为其他人对自己的安全性更信任。听起来很合乎逻辑(在这里插入讽刺意味)。他可以学习密码学的基础知识,并开始构建自己的系统。所有最好的密码学家都从某个地方开始。与其给他/她一个关于初学者的徒劳无用的故事,不如说不是,而是鼓励他们继续学习和测试并将系统展示给公众进行测试。

–妖怪
17年4月9日在10:19

自己动手做脑部手术有什么问题?您似乎将其作为失败的示例,但是在给定的情况下我找不到问题。

–迈克尔·理查森(Michael Richardson)
17年4月17日在20:49

尤其是婆婆

– Aganju
17年4月18日在11:09

@Yokai,我想他已经说过了。将您自己的加密货币作为学习过程进行滚动,然后将其丢弃并使用专家多年测试的东西。

– NH。
19年5月29日在20:05



#3 楼

布鲁斯·施耐尔(Bruce Schneier)在1998年写道:

任何人,从最笨拙的业余爱好者到最好的密码学家,都可以创建自己无法破解的算法。甚至都不难。困难的是创建一种即使经过多年的分析也无法打破的算法。唯一证明这一点的方法就是让算法受到周围最好的密码学家的多年分析。 />任何人都可以发明一个如此聪明的安全系统,以至于他或他都想不出如何破解它。

作为后续,这又来自施耐尔: br />当有人交给您一个安全系统并说“我相信这是安全的”时,您首先要问的是“您到底是谁?”告诉我您为证明您对系统安全性的主张所具有的破坏力而做的事情。在七十年代初期,我设计了一种我认为是出色的加密方案。将简单的伪随机数流添加到明文流以创建密文。看来这将阻止对密文进行任何频率分析,即使对于最机智的政府情报机构而言也无法破解。我为自己的成就感到自满。因此,请放心。
几年后,我在一些密码学入门文章和教程论文中发现了相同的方案。多好。其他密码学家也曾想到过相同的方案。不幸的是,该方案只是作为有关如何使用基本密码分析技术来轻松破解它的简单作业而提出的。非常适合我的出色计划。


评论


很高兴知道“密码学入门文本”是什么:)

– ithisa
13年5月8日在15:19

这里的隐含答案是,由于PRNG会产生“随机”噪声,因此ASCII文本是否可能要进行频率分析和其他类似方法?

–haventchecked
17年1月9日在23:31

@haventchecked我认为,如本答案及其链接中所述,PRNG本身相当容易破解。

– David Moles
18年11月6日在4:18

#4 楼

原始帖子要求提供示例:

Babington图解是一个不好的密码系统导致问题的好故事。苏格兰的玛丽女王(Mary Queen of Scots)被她的表弟伊丽莎白女王(Elizabeth I)囚禁,并通过加密信件与外界进行交流。字母被花体,十字形圆圈和三角形的密码字母所代替,并为普通字母分配了额外的字母,例如e,t,i和o,因此无法通过频率分析快速找到字母的含义。他们还添加了一些空字符,这些空字符在解密时会被忽略,以抛弃分析人员。问题在于,女王/托马斯·费利佩斯(Thomas Phelippes)的职员对她的工作人员进行了非常称职的密码分析,他能够在消息被截获时对其进行解密。让她逃脱并继承王位。女王的探员在传递玛丽的最后一封信之前将其截获时,他们添加了一个加密句子,询问情节中涉及的人的名字,“以便他们能得到适当的奖励。”玛丽的通讯员尽职尽责,女王的特工也让所有参与其中的人被处决。

我的孩子很小的时候,我会在午餐时给他们寄密码(带钥匙(使用Vernam密码))。通常,它们只是开玩笑,但它们从来都不重要。在这种情况下,自己滚动即可。如果您打算推翻英格兰女王(或伊朗国王或正在缓慢改革的缅甸暴徒政权),我建议您确保不要轻易解密正在使用的内容。正如布鲁斯·施耐尔(Bruce Schneier)所说,任何人都可以提出一种他们无法解密的密码系统,但是提出一个其他人都无法解密的密码系统会变得更加困难。

评论


那是一个很酷的故事!

– NH。
19年5月29日在20:12

#5 楼

我将举例说明我在这里工作的地方。我的一位同事负责设计公司FTP帐户的密码存储系统(长话短说,不要问)。我被要求接管,我看到的第一件事是:

public string Encrypt(string rawText)
{
    // homebrew code here
}
public string Decrypt(string encrypted)
{
    // homebrew code here
}


我立即将它们撕掉,用标准的加密库调用替换了它们-当我当时被质疑时,我回答:

“您永远不会推出自己的加密例程。”

我的同事为此奋斗了几个小时。他花了很多时间来完善它,以使攻击者无法破坏它。他们甚至说过:“这比AES256安全得多,因为没人知道它是如何工作的。”

那时,我知道两件事:


我的同事是邓宁·克鲁格效应的完美典范(
由于对某个学科知识不足,因此更有可能高估自己的能力)
我的同事必须予以纠正。不仅因为它们是“错误的”,而且还因为它们负责架构其他系统,而且我不希望它们保持自制的加密。

所以我将代码放在一边。相反,我尝试通过简单地调用Encrypt()函数并检查输出来破坏例程。我是新手-我不是加密分析师-但是只花了4个小时。我向他们展示了破解方法,引导他们完成了我的步骤,并重申:永远不要进行自己的加密。希望他们将它牢记在心,再也不会再做。

所以可以归结为:没有
了解它的实际安全性。

评论


也许您是我们的第三方提供商?我们只能使用执行此操作的程序。我花了30分钟时间来解密我们系统的所有加密密码(包括第三方提供商为其所有客户使用的主密码)。然后,我深入研究了他们的程序逻辑,发现了大约30行代码,基本上可以做到这一点:https://xkcd.com/153/。更好的是,该程序的一部分(创建于2015年)实际上以明文形式存储密码。谈论安全失败。

–ctwheels
'18 Apr 30在16:00



#6 楼

在密码学中,您不会只有一个对手以您期望的方式攻击您。这就是很难推理的原因,因为您必须考虑绝对的一切。我们所能做的最好的事情就是尽可能地利用我们的常识和现有研究成果,并从那里逐步采取行动,逐个攻击向量地进行攻击。无论是物理研究还是最高水平的下棋,人类的能力都会得到解决。当您遇到第一个熟练的对手时,您将以更多可计数的方式被最先进的技术所掩盖。

TL; DR人类太愚蠢,无法独自进行加密。

评论


嗯,只用一个时间垫。 :P(玩)

–通配符
17年9月19日在0:51

该TL; DR是SE中充满报价的报价中报价最高的报价之一。

–杰瑞德·史密斯(Jared Smith)
18年11月21日在18:34

#7 楼

实际上,先滚动您自己的加密货币,然后再扔掉。

正如Crypto Fails所说的那样,说完全不能编写任何加密代码有点苛刻。主要问题是不要使用该代码并在任何地方(在发行的软件中)使用它。如果您是密码分析专家的朋友,甚至可以得到他们对您所写内容的反馈,那就更好了。如果值得,那么他们也会告诉您不要在现实生活中使用该代码,但是他们应该能够为您提供一些信息,以帮助您学习和成长。

#8 楼

通常不可能保证设计密码系统的人不会离开创建密码系统的公司,并利用其对设计的知识损害其前雇主的利益,除非以这样的方式设计密码系统:对手可能获得的这种知识可能变得毫无用处。

如果某人拥有的加密系统即使对只知道密钥的一切都不知道的攻击者来说也是安全的,并且将密钥更改为新的随机生成的值,那么该系统将可以保护没有新密钥的任何攻击者。即使攻击者在更改密钥之前有足够的信息来破坏系统,他们之后也将无法破坏系统。将密码系统设计得足够好,以至于在没有内幕知识的情况下,破解它的成本将超过这样做所能获得的任何价值。不是因为设计好的密码很容易,而是因为大多数系统都没有用来保护任何对攻击者有价值的东西(即使熟练的密码学家可以在58分钟之内轻松破坏系统,这也不是一件容易的事)除非此类信息对攻击者的价值超过了密码学家花费的时间,否则存在风险。)

设计一个系统,使其对具有内部数据的人更可靠。很难,而且只有很少的人具有足够的专业知识来设计一个系统,而该系统可以通过更改密钥而由对设计有充分了解的内部知识和密码学专门知识的人变得健壮。没有内幕知识的密码专家可能必须检查设计师可能犯下的成百上千种潜在错误,但是内幕知识可以使该人立即识别并利用错误。

#9 楼

我认为您的问题忽略了重要概念。

使用您自己的系统并取决于系统的安全性是两个完全不同的概念。

在使用行业标准代码同时具有行业标准安全性的同时,也可以使用自己的自定义代码作为额外的防御层。使用您自己未经测试,未经验证的代码作为唯一的防线是没有意义的。

如果您的代码仅在攻击者已经破解了您所有的行业标准安全措施并且您将其作为“最后防线”时才相关,那么您将不会因此而损失。

如果您的代码已公开并且可以利用可利用的安全漏洞?如果这是您唯一的防线?现在,这是一个愚蠢的决定。

评论


该答案以约150票的总票数没有增加到前四个答案中。

–cremefraiche
16年2月9日,0:52

#10 楼

我喜欢自己动手的想法。今天关于数学/密码学发现的事情是,很难得到同行评议,也许是不可能的。因为审查一个提出的问题可能和研究它一样多或更多。这不应阻止探索和发现的乐趣。对于我来说,非对称方案更困难,更沉迷于数学,并且对我来说更令人尴尬地容易破解。对称的方法就更少了。我认为一种好的对称方法应该对位(而不是字节或块)流(每位数据都影响到其他位的多米诺骨牌)进行操作,并对10000 0进行加密,以与9999 0和一个嵌入式1(我知道的任何强大方法(例如rijndael,DES等)都无法做到这一点)。而且,如果密钥的任何一位(无论长度有多长)是错误的,解密都将彻底失败,因为在输出中没有可识别的纯文本。专有算法没错。美国国家安全局要跳的又一个障碍。

评论


克里斯-我认为大多数标准的加密算法都受到了同行的严格审查。 AES进行了多年的全球审查​​。 SHA-3的处理过程与此类似。

–尼尔·史密斯汀(Neil Smithline)
15年5月14日在20:34

我想知道“我认为一个好的对称...”后面的文字是否与这个问题确实无关。

–尼尔·史密斯汀(Neil Smithline)
15年5月14日在20:35

是的,绝对可以,在您自己的个人计算机上进行大量的探索和发现,并从中获得很多乐趣,这些数据不需要关心秘密。

–通配符
17 Sep 19'0:52



关于单个传播位不能与AES,DES等一起使用,您是不正确的。重要的是块操作模式。具体来说,像PCBC这样的传播模式将确保单个位会改变整个输出。

–森林
18年2月14日在3:54

#11 楼

密码示例Phil Zimmermann引用了以下内容:


在明文流中添加了一个简单的伪随机数流以创建密文。


很容易受到阻碍。有人问为什么。原因如下:


步骤1,输入全0的密文。由于将0加到任意数字上都等于未更改的数字,因此它将完全在输出中公开伪随机数字流。
给出步骤1中发现的内容并给出秘密消息的加密文本,给出步骤2。 ,您可以通过简单地减去现在知道的伪随机数流来轻松地计算原始文本。首次创建的任何密码算法,即使是由专家创建的,也具有未知的安全强度。专家的优势在于能够立即应用典型的已知攻击并了解新密码的状态,并能够迅速排除某些发明为弱者,而业余爱好者则不具备这种能力。但这并不一定意味着密码很弱。这意味着强度是未知的,并且很可能是非常强的密码。您只是不知道。

例如我不是专家。这是一个微不足道的密码,我花了5秒钟就想到了:


随机选择128位数字作为密钥。
circular将密钥旋转X数,将结果值A调用。
将密钥循环旋转Y个位数,将其拆分为两个64位部分,并将它们相乘以生成值B。
对值A和B进行XOR运算一个新密钥,仅使用此密钥的位0到N-1进行XORing加密N位纯文本。
返回并重复步骤2,3,4。

这似乎很简单,我还没有做任何分析来看看它有多强大。但是我只能说这具有未知的安全强度。它可能非常强大。如果您立即得出结论说它是弱的或不可靠的,我挑战您提出一种破解它的方法。可以吗?

我认为安全强度只有两个:


安全强度未知
已知的安全强度弱
/>
没有所谓的强大安全实力。如果对该计划进行了仔细检查而未发现任何裂缝,则仅意味着尚未发现任何裂缝,状态仍然未知,并且不一定意味着很强,因为明天很可能会发现裂缝。 >

评论


这是为什么不应该使用自己的密码的一个很好的例子:它对选择明文攻击的缺点与Zimmermann的密码完全一样。输入全0的纯文本,该纯文本至少与您要尝试解码的密文一样长,并且您会获得用于编码密文的密钥流。将其与未知密文进行XOR,您将得到原始消息。

–马克
2014年7月24日在1:09



安东尼-您的最后一段是正确的,但是尽管您认为自己的例子很有效,但您的例子却很薄弱。这只是有助于支持该原则,即:除非您是专家,否则不要这样做。即使您是专家,也不要一个人做。

–Rory Alsop♦
2014年7月24日7:20



首次创建时,任何密码算法都具有未知安全强度的状态并非完全正确。现代密码是基于一组有限的,经过充分研究的,众所周知的数学构造而建立的,例如置换-置换网络,feistel网络和add-rotate-xor。尽管仍然需要进行深入的审查,但是密码学家可以一目了然地知道密码是经过精心设计和可靠设计的。

–森林
18年1月18日在21:31

@RoryAlsop为什么您说他的最后一段是正确的?尽管对于密码来说确实如此,但是诸如poly1305之类的东西在信息论上是安全的。它是“众所周知的强者”。

–森林
18年1月18日在21:35

好的设计通常不是错误的。密码学中的大多数优秀设计都是通过了解其他系统的漏洞并添加防御措施或确保不会出现的问题来完成的。

–巨石
18年1月18日在23:30