Secure random token in Node.js
在这个问题中,erik需要在node.js中生成一个安全的随机令牌。有一种方法可以生成随机缓冲区。但是,节点中的base64编码不是URL安全的,它包括/和+,而不是-和_。因此,生成这种令牌的最简单方法是
1 2 3
| require('crypto').randomBytes(48, function(ex, buf) {
token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
}); |
有更优雅的方式吗?
- 剩下的代码是什么?
- 再也不需要了。你想看看剩下的什么?
- 不管怎样,我让它起作用,只是不确定你是怎么扔进去的,但我对这个概念有了更好的理解。
- 我做了一个NPM包:npmjs.com/package/secure-random-string
- 无耻的自我插入,我创建了另一个NPM包:Tokgen。可以使用与正则表达式('a-zA-Z0-9_-'中的字符类类似的范围语法指定允许的字符。
- 兰德令牌为我工作
- 这对于任何想要特定字符串长度的人来说都很方便。3/4用于处理基本转换。/*返回长度为*/函数的base64编码字符串randomstring(length)返回crypto.randombytes(length*3/4)。toString("base64");适用于具有这些字符限制的数据库。
- 同步:require('crypto').randomBytes(48).toString('base64').replace(/\//g,'_').replace(/\+/g,'-'); 。
(P)Try Crypto.Randombytes():(p)字母名称(P)The'hex'encoming works in node V0.6.x or newer.(p)
- 看起来好多了,谢谢!不过,"base64-url"编码还是不错的。
- Tantek做了一些有趣的工作:tantek.pbworks.com/w/page/24308279/newbase64
- 谢谢你的提示,但我认为OP只是想要已经标准的RFC3548第4节"使用URL和文件名安全字母表进行base 64编码"。在我看来,替换字符"足够优雅"。
- 如果你想把上面的内容作为bash-one的一行程序,你可以做node -e"require('crypto').randomBytes(48, function(ex, buf) { console.log(buf.toString('hex')) });"。
- 你也可以做buf.toString('base64')来得到base64编码的数字。
- 为了便于安装,我把它做成了一个NPM模块。埃多克斯1〔2〕
- @JH使用base64编码比十六进制编码更安全?
- @Kittymink2不,但它比较短。
- 有关使用URL和文件名安全字母表进行base 64编码的信息,请参阅下面的answser。
- 德米特里优秀的单内衬的一个稍微紧凑的版本:node -p"require('crypto').randomBytes(48).toString('hex');"(如果需要的话,用hex代替base64)
(P)如果你不是一个像我这样的JS专家的话关于如何获得内线函数变量的问题,需要花点时间(p)字母名称
- 另外,如果您不想将所有内容都嵌套。谢谢!
- 虽然这确实有效,但请注意,在大多数情况下,您希望在JH的答案中演示异步选项。
- 埃多克斯1〔6〕
0.利用纳米第三部分图书馆注布尔奇1(P)https://github.com/ai/nanoid(p)字母名称(P)(p)1.基地64 Encding with URL and filename safe alphabet(P)Page 7 of RCF 4648 describes how to encide in base 64 with URL safety.You can use a existing library like base64URL to do the job.(p)(P)The function will be:(p)字母名称(P)Usage example:(p)字母名称(P)Note that the returned string length will not match with the size argument(size!页:1(p)(P)(p)2.Crypto random values from limited set of characters布尔奇1(P)You can also build a strong random string from a limited set of characters like that:(p)字母名称(P)Usage example:(p)字母名称
- 哪一个是你在生产中工作的首选?
- @lexynux解决方案1(使用URL和文件名安全字母表进行base 64编码),因为它是安全性方面最强的解决方案。此解决方案只对密钥进行编码,不会干扰密钥的生产过程。
- 谢谢你的支持。你有什么可以与社区分享的工作实例吗?会受到欢迎吗?
- 注意生成的随机字符串不是均匀分布的。一个简单的例子是,对于长度为255、字符串长度为1的字符集,第一个字符出现的机会是第一个字符出现的两倍。
- @Dodekeract是的,你在谈论解决方案2。这就是为什么解决方案1更加强大的原因
- 我在回复github.com/ai/nanoid中添加了nanoid第三方库
(P)The up-to-date right way to do this asynchronously using ES 2016 standards of ASYNC and await(as of node 7)would be the following:(p)字母名称(P)This works out of the box in node 7 without any babel transformations(p)
- 我已经更新了这个示例,将新的传递命名参数的方法结合在一起,如下面所述:2ality.com/2011/11/keyword-parameters.html
(P)Random URL and filename string safe(1 lines)(p)字母名称
- 答案很简单!请注意,它可能会以一种不确定的方式暂停事件循环(仅当它经常在有点负载、时间敏感的系统中使用时才相关)。否则,做同样的事情,但是使用RandomBytes的异步版本。参见nodejs.org/api/…
- 如果长度为48,则不需要最后一次更换…
(P)With ASYNC/Await and Promise.(p)字母名称(P)类似的几代人(p)
(P)Look at EDOCX1 English 0 Es2016 way,it's more correct.是的。(p)Ecmascript 2016(ES7)way字母名称(P)
(p)创造者/Yield Way字母名称
- @事实上,Javascript正在升级:)查找承诺和生成器!
- 尝试等待,另一个ECMA7承诺处理程序
- 我认为你应该把ES2016作为第一个例子,因为它在大多数情况下正朝着"正确的方法"发展。
- @真的很有道理,我会的。
- 我在下面添加了一个特定于节点的答案(使用REQUEST而不是IMPORT)。你为什么使用进口商品有什么特别的原因吗?你让巴贝尔跑吗?
- @我真的吃了,我已经恢复使用commonjs,直到正式支持导入。
(P)检查出来:(p)字母名称
- 好极了!绝对低估的解决方案。如果您将"length"重命名为"desiredlength",并在使用它之前用一个值初始化它,那就太好了:)
- 对于任何想知道的人来说,对于所需的奇数长度,ceil和slice调用是必需的。即使长度相等,也不会改变任何东西。
(P)NPM module anyid provides flexible API to generate various kinds of string id/code.(p)(P)To generatite random string in a-za-Z0-9 using 48 random bytes:(p)字母名称(P)To generate fixed length alphabet only string filled by random bytes:(p)字母名称(P)Internally it used EDOCX1 theocx1 generation random.(p)
(P)https://www.npmjs.com/package/crypto-extra has a method for it:(p)字母名称
(P)Here is an async version taken verbatim from above@yves m.'s answer(p)字母名称