gpt4 book ai didi

javascript - 这是在 JavaScript 中生成安全随机字符串的好方法吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:32:51 25 4
gpt4 key购买 nike

下面是我编写的一些代码,用于在 JavaScript 中生成随机字符串。如果我将从此方法收到的值用作用户的盐或 token ,是否存在任何安全问题?

String.random = function(length, characters) {
length = length === undefined ? 32 : length;
characters = characters === undefined ? 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' : characters;

var maxIndex = characters.length - 1;
var string = '';

for(var i = 0; i < length; i++) {
string += characters[Number.random(0, maxIndex)];
}

return string;
}

最佳答案

您可以使用 crypto.getRandomValues() 在 javascript 中获取加密安全随机数,但它们不是像 Math.random() 这样的十进制数,因此处理它们需要更多的工作。这是带有 crypto.getRandomValues() 的普通 javascipt 解决方案:

function getCryptoRandomBetween(min, max){
//the highest random value that crypto.getRandomValues could store in a Uint32Array
var MAX_VAL = 4294967295;

//find the number of randoms we'll need to generate in order to give every number between min and max a fair chance
var numberOfRandomsNeeded = Math.ceil((max - min) / MAX_VAL);

//grab those randoms
var cryptoRandomNumbers = new Uint32Array(numberOfRandomsNeeded);
crypto.getRandomValues(cryptoRandomNumbers);

//add them together
for(var i = 0, sum = 0; i < cryptoRandomNumbers.length; i++){
sum += cryptoRandomNumbers[i];
}

//and divide their sum by the max possible value to get a decimal
var randomDecimal = sum / (MAX_VAL * numberOfRandomsNeeded);

//if result is 1, retry. otherwise, return decimal.
return randomDecimal === 1 ? getCryptoRandomBetween(min, max) : Math.floor(randomDecimal * (max - min + 1) + min);
}

function getRandomChar(str){
return str.charAt(getCryptoRandomBetween(0, str.length - 1));
}

String.random = function(length, characters) {
for(var i = 0, str = ""; i < length; i++) str += getRandomChar(characters);
return str;
};

console.log(String.random(60, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));

在眼睛上相当粗糙,但它有效。如果你想要一个更简单的解决方案,我更喜欢 rando.js 。它适用于纯 javascript 以及 Node.js/React。您可以使用 rando(str) 从字符串中获取随机字符,因此按照您想要的方式构建随机字符串非常简单:

String.random = function(length, characters) {
for(var i = 0, str = ""; i < length; i++) str += rando(characters);
return str;
};

console.log(String.random(60, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));
<script src="https://randojs.com/2.0.0.js"></script>

让我重申一下,这两种解决方案生成的字符串都具有足够的熵,可以安全地用作用户的密码、盐或 token 。

关于javascript - 这是在 JavaScript 中生成安全随机字符串的好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23249823/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com