【发布时间】:2018-07-28 17:01:16
【问题描述】:
我对一个简单的算法有一个非常基本的想法,它允许用户通过请求发送到他们的电子邮件的随机代码来重置他们的密码。
如果用户忘记了他们的 PW,他们可以请求服务器生成重置代码并将其作为电子邮件发送给他们。然后将此代码附加到他们在数据库中的用户条目中。确认输入表单将要求用户在前端输入重置代码 - 如果失败,代码将被标记并失效。如果成功,他们将被发送到一个新的 PW 重置表单,在那里他们可以通过向后端发送 PUT 请求来更新要替换的凭据。
这是我的基本想法 -
function generate7KeyPasswordResetConfirmationCode() {
const arrayOfSeven = [1, 2, 3, 4, 5, 6, 7]
const alphabet = [Array of 26 Lowercase Chars and 26 Uppercase Chars]
const letterOrNumber = arrayOfSeven.map(currentPos => {
// return pseudorandom number between 0-100
const oneToOneHundred = Math.floor(Math.random() * Math.floor(101))
if (oneToOneHundred < 50) { return "char" }
else if (oneToOneHundred >= 50) { return "num" }
})
const resetKey = letterOrNumber.map(numOrChar => {
// return pseudorandom number between 0-51 and return a-z-A-Z
if (numOrChar === "char") {
const index = Math.floor(Math.random() * Math.floor(52))
return alphabet[index]
}
// return pseudorandom number 0-9
if(numOrChar === "num") {
return Math.floor(Math.random() * Math.floor(10))
}
})
return resetKey
}
但是,我的方法涉及到 Math.random(),我在 MDN 上注意到了这个东西:
Math.random() does not provide cryptographically secure random numbers. Do not use them for anything related to security. Use the Web Crypto API instead, and more precisely the window.crypto.getRandomValues() method
我意识到我可以只使用 uuid4,但我想创建自己的解决方案 - 这究竟是如何破解的?如果我在第一次尝试失败时使代码无效,还会出现什么问题?
【问题讨论】:
-
什么意思?你能详细说明一下吗?
-
使用随机数生成密码与使用它们进行密码学完全不同。
-
一般的想法是创建一个长度为
7的随机字符串 - 使用 math.rand() 两次,所以有两件事是随机的 - 给定的索引是数字还是字母 - 并且实际数字或字母。这只是一种允许用户更改其 PW 的简单方法 - 实际的 PW 加密是在后端使用 bcrypt 完成的 -
@MaartenBodewes,我看到了这个 - 但是文档并不足以让我理解它。返回的数字范围是多少?它似乎在负150和正150之间?我需要能够控制但随机化数字范围。无论如何,我尝试了我的解决方案,它形成了一个随机的 7 个字符键,字母/数字位置是随机的。通过一些进一步的加密层,我认为这是一个足够的解决方案。
标签: javascript node.js authentication cryptography authorization