Pen*_*ica 5 security random cryptography token node.js
如果您需要生成字符串/令牌来验证未来的请求(例如API密钥,电子邮件确认URL等),应考虑哪些因素?
特别是
一个实际的例子
让我们从NodeJS中获取这两个输出字符串.
字符串1(通过节点加密)
var crypto = require('crypto');
crypto.randomBytes(48, function (ex, buf) {
console.log(buf.toString('hex'));
});
Run Code Online (Sandbox Code Playgroud)
字符串2(通过节点UUID)
var uuid = require('node-uuid');
console.log(uuid.v4());
Run Code Online (Sandbox Code Playgroud)
基于上面概述的概念,哪一个更安全,为什么?
此外,请随时提出有关该主题的任何好的介绍性材料,因为我无法在网上轻松找到有关此内容的文章.
是什么让字符串"安全"/"非常难以猜测"?
字符串或标记不能加密安全,因为它是静态的.
密码安全(伪)随机数发生器(CS(P)RNG)的概念描述了所产生的数字是不可预测的.这是程序的属性,而不是个别数字的属性.
如何测量/估算"安全数额"?
这取决于所使用的随机源,因为其中一些是黑盒子.您可以生成大量随机性,看看是否在那里找到了一些模式.有一些测试套件可用,但是你必须考虑你的应用程序以及你需要多快的随机数.请求大量随机性可能耗尽池,然后产生不充分的随机数.
那里的主要标准是什么?
使用系统的/框架指定的加密安全随机源.crypto.randomBytes()
如果你想信任文档,Node.js' 就是其中之一.
一个实际的例子
node-uuid在crypto.randomBytes()
内部使用,因此它背后的随机性强度基本相同,但Math.random()
如果crypto.randomBytes()
不可用则会回退.Math.random()
是不是加密安全.如果您想在浏览器中拥有加密安全的随机值,则需要查询Web Crypto API getRandomValues()
.