从crypto.randomBytes中排除某些字符的正确方法

时间:2013-05-18 22:56:25

标签: javascript node.js coffeescript

我有以下代码,基于http://nodejs.org/docs/v0.6.9/api/crypto.html#randomBytes

crypto.randomBytes 32, (ex, buf) ->
  user.tokenString = buf.toString("hex")
  user.tokenExpires = Date.now() + TOKEN_TIME
  next()

我使用它生成一个tokenString用于node.js / express用户验证。

在某些情况下,生成的tokenString包含'/'正斜杠字符,这会破坏我的路由,例如,如果tokenString像'$2a$10$OYJn2r/Ts.guyWqx7iJTwO8cij80m.uIQV9nJgTt18nqu8lT8OqPe'那样它找不到/user/activate/$2a$10$OYJn2r,那就是tokenString。我收到404错误

是否有更直接的方法可以在生成crypto.randomBytes时排除某些字符?

1 个答案:

答案 0 :(得分:2)

Crypto.randomBytes生成随机字节。这与字符无关,字符由我们字节的方式决定。

例如:

user.tokenString = buf.toString("hex")

将缓冲区转换为字符串范围0-9a-f

中的字符串(其中两个字符代表每个字节)

另一种(可能更合适的方法是使用更紧凑的编码.Base64Url是一种提供URL /文件名安全的字符串编码的编码

user.tokenString = base64url(buf)

这是an NPM package you can use for it

除此之外,您的代码似乎很好。如果您在未指定.toString()的情况下致电"hex"或指定"ascii"之类的内容,则会像在您的问题说明中那样中断。