2013-09-21 3 views
4

randomString.luaМоя функция «randomString» продолжает возвращаться один и тот же результат

---------------------------------------------------------------------------- 
-- File: randomString.lua 
-- Author: Don Draper 
-- 
-- This is the Lua implementation of my simple 'randomString' function 
-- which I previous wrote in PAWN. 
---------------------------------------------------------------------------- 

randomString = {} 

local randomCharset = { 
    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 
    "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" 
} 

function randomString.generate(length) 
    local currentString = "" 
    for index = 1, length do 
     currentString = currentString .. randomCharset[math.random(1, #randomCharset)] 
    end 
    return currentString 
end 

Test.lua

require("randomString") 

print(randomString.generate(16)) 
io.read() 

Так вот моя функция «randomString», который я изначально писал на языке программирования пешку , Я думал, что воспользуюсь им для создания паролей. Однако всякий раз, когда я вызываю свою портированную функцию, он всегда возвращает тот же вывод, когда я запускаю программу.

Возьмите этот кусок кода, например.

for i = 0, 100 do 
    print(randomString.generate(16)) 
end 

Он всегда будет генерировать тот же список случайных строк. Может кто-нибудь объяснить, почему? Заранее спасибо!

+0

Не используйте такой код (даже с 'math.randomseed') в целях безопасности. 'math.random' не является криптографически безопасным. – CodesInChaos

+0

@CodesInChaos, как вы собираетесь генерировать случайные строки для паролей? Я буду использовать его с SHA256. – Bicentric

+0

Вам понадобится доступ к безопасным случайным номерам, предоставляемым вашей операционной системой. В окнах это означает оболочку для 'CryptGenRandom', для linux это означает чтение из'/dev/urandom'. – CodesInChaos

ответ

7

math.random генерирует последовательность pseudorandom номера, то есть детерминированная последовательность, которая будет напоминать действительную случайную последовательность. Последовательность, сгенерированная math.random, всегда будет одинаковой, если вы не используете math.randomseed.

Для каждого возможного значения, которое вы вызываете math.randomseed, math.random будет генерировать другую псевдослучайную последовательность.

Попробуйте это, к примеру, и вы увидите другую последовательность:

math.randomseed(7654321) 
for i = 0, 100 do 
    print(randomString.generate(16)) 
end 

Если вы хотите действительно случайную последовательность, вы должны кормить randomseed с истинным случайным числом перед началом генерации.

+0

Ahh Я вижу Это имеет смысл, спасибо за ваш быстрый ответ! – Bicentric

+1

Нискованный здесь, но даже тогда результат не будет последовательностью действительно случайных чисел. Это будет псевдослучайная последовательность, выбранная семенем, полученным из действительно случайного числа. Разница небольшая, но все же значительная для некоторых целей. Если, например, последовательность должна была использоваться для шифрования потокового шифра, то слабая псевдослучайная последовательность могла бы сделать всю криптосистему слабой, независимо от того, насколько хорошо вы выбрали семя. – RBerteig

+1

@RBerteig Да! Ты прав! И, учитывая контекст вопроса о ФП, он не является ничтожным. Спасибо за это разъяснение! Стоит отметить, что встроенный случайный генератор Lua не является генератором криптографической силы, поэтому его нельзя использовать для приложений, где безопасность имеет первостепенное значение. –

Смежные вопросы