What makes a string / token cryptographically secure?
如果您需要生成字符串/令牌来认证将来的请求(例如API密钥,电子邮件确认URL等),应考虑哪些因素?
尤其是
-
是什么使字符串" secure" /"很难猜"?
-
如何测量/估计"安全量"?
-
那里的主要标准是什么?
一个实际的例子
让我们从NodeJS中获取这两个输出字符串。
字符串1(通过Node crypto)
1 2 3 4
| var crypto = require('crypto');
crypto.randomBytes(48, function (ex, buf) {
console.log(buf.toString('hex'));
}); |
字符串2(通过节点UUID)
1 2
| var uuid = require('node-uuid');
console.log(uuid.v4()); |
根据以上概述的概念,哪一个更为安全?为什么?
另外,请随意建议有关该主题的任何入门材料,因为我很难在网上找到有关此主题的文章。
-
我几乎不认为您的详细信息和使用目的有所不同。
-
@marekful,谢谢! 我试图到达这里的地方是:如何理解差异?
-
检查此页面上的加密强度随机性。
-
看看这个要点,它建议使用uuid,但不要使用node-uuid。 为了生成令牌,您可以在此uuid v4字符串上使用哈希函数
What makes the string"secure" /"very hard to guess"?
字符串或令牌不能是加密安全的,因为它是静态的。
密码安全(伪)随机数生成器(CS(P)RNG)的概念描述了生成的数字是不可预测的。这是程序的属性,而不是单个数字的属性。
How is the"security amount" measured / estimated?
这取决于所使用的随机性源,因为其中一些是黑匣子。您可以产生很多随机性,看看是否在其中找到了一些模式。有一些可用的测试套件,但是您必须考虑您的应用程序以及需要这些随机数的速度。请求大量随机性可能会耗尽池,然后产生不足的随机数。
What are the main standards out there?
使用系统/框架指定的加密安全随机性源。如果您想信任文档,则Node.js的crypto.randomBytes()是其中之一。
A practical example
node-uuid内部使用crypto.randomBytes(),因此其背后具有基本相同的随机强度,但是如果crypto.randomBytes()不可用,它将降级为Math.random()。 Math.random()不是加密安全的。如果要在浏览器中使用加密安全的随机值,则需要查询Web Crypto API的getRandomValues()。
-
不幸的是,node-uuid将无声地回退到不安全的PRNG。
-
是的,它将退回到不安全的PRNG,但仅适用于浏览器环境或真正的旧node.js版本。
-
就我个人而言,我更喜欢它错误地指出"无法在不安全的平台上安全使用此软件,请更新您的软件"。
-
@ScottArciszewski:但是,uuid的目的不是安全性,而是唯一性是不同的。当您需要安全令牌时,不应使用UUID。
-
Id辩称:如果您想要唯一性,则需要CSPRNG:P -但是,是的,UUID会使安全令牌设计很糟糕。
-
@ScottArciszewski,除了回退到某些JS引擎(浏览器环境或旧的node.js版本)上不安全的PRNG之外,为什么node-uuid导致可怕的安全令牌设计?
-
@NeilSlater,除了回退到某些JS引擎(浏览器环境或旧的node.js版本)上不安全的PRNG之外,还有其他原因为什么不应该使用node-uuid来生成安全令牌吗?
-
@Pensierinmusica:不,那是主要原因。您容易受到攻击,并且必须始终检查实施。 UUID v4的任何实现的作者都没有义务使用安全的RNG,并且他们可能会将实现更改为将来不太安全,即使今天是安全的。碰巧的是,安全的RNG和uuid的唯一性问题通常会重叠。不要依赖它-如果您在开始使用uuid作为安全令牌后使用了较不安全的RNG,那将是您的错和问题。如果安全是您的主要关注点,请使用用于安全性的库。
-
@NeilSlater,我明白了,谢谢您的澄清!顺便说一句-在NodeJS生态系统内-然后crypto.randomBytes将是第一个生成安全随机令牌的候选者,还是您有其他更合适的选择?
-
@Pensierinmusica:是的。我想看看这个问题:stackoverflow.com/questions/8855687/
-
看看这个要点,它建议使用uuid,但不要使用node-uuid。为了生成令牌,您可以在此uuid v4字符串上使用哈希函数
-
@Reyske不知道那个要旨的作者试图在没有示例的情况下说些什么。 uuid软件包与我在答案中发现的node-uuid有着相同的问题。