mirror of
https://github.com/anope/anope.git
synced 2026-06-12 19:14:47 +02:00
Use the C++11 random number generator instead of rand().
This is safer, faster, and doesn't require seeding.
This commit is contained in:
@@ -395,19 +395,6 @@ options
|
||||
*/
|
||||
casemap = "ascii"
|
||||
|
||||
/*
|
||||
* This key is used to initiate the random number generator. This number
|
||||
* MUST be random as you want your passcodes to be random. Don't give this
|
||||
* key to anyone! Keep it private!
|
||||
*
|
||||
* NOTE: If you don't uncomment this or keep the default values, any talented
|
||||
* programmer would be able to easily "guess" random strings used to mask
|
||||
* information. Be safe, and come up with a 7-digit number.
|
||||
*
|
||||
* This directive is optional, but highly recommended.
|
||||
*/
|
||||
#seed = 9866235
|
||||
|
||||
/*
|
||||
* Sets the number of invalid password tries before services removes a user
|
||||
* from the network. If a user enters a number of invalid passwords equal to
|
||||
|
||||
@@ -558,6 +558,9 @@ namespace Anope
|
||||
*/
|
||||
extern CoreExport Anope::string Random(size_t len);
|
||||
|
||||
/** Generate a random number. */
|
||||
extern CoreExport int RandomNumber();
|
||||
|
||||
/** Calculates the levenshtein distance between two strings.
|
||||
* @param s1 The first string.
|
||||
* @param s2 The second string.
|
||||
|
||||
+1
-1
@@ -679,7 +679,7 @@ public:
|
||||
: Manager(creator)
|
||||
, Timer(300, true)
|
||||
, serial(Anope::CurTime)
|
||||
, cur_id(rand())
|
||||
, cur_id(Anope::RandomNumber())
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ class EBCRYPT final
|
||||
{
|
||||
char entropy[16];
|
||||
for (auto &chr : entropy)
|
||||
chr = static_cast<char>(rand() % 0xFF);
|
||||
chr = static_cast<char>(Anope::RandomNumber() % 0xFF);
|
||||
|
||||
char salt[32];
|
||||
if (!_crypt_gensalt_blowfish_rn("$2a$", rounds, entropy, sizeof(entropy), salt, sizeof(salt)))
|
||||
|
||||
@@ -249,7 +249,7 @@ class ESHA256 final
|
||||
void NewRandomIV()
|
||||
{
|
||||
for (auto &ivsegment : iv)
|
||||
ivsegment = static_cast<uint32_t>(rand());
|
||||
ivsegment = static_cast<uint32_t>(Anope::RandomNumber());
|
||||
}
|
||||
|
||||
/* returns the IV as base64-encrypted string */
|
||||
|
||||
@@ -246,7 +246,7 @@ public:
|
||||
int i = 0;
|
||||
do
|
||||
{
|
||||
guestnick = guestprefix + stringify(static_cast<uint16_t>(rand()));
|
||||
guestnick = guestprefix + stringify(static_cast<uint16_t>(Anope::RandomNumber()));
|
||||
if (guestnick.length() > nicklen)
|
||||
guestnick = guestnick.substr(0, nicklen);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public:
|
||||
{
|
||||
char c;
|
||||
do
|
||||
c = 48 + (rand() % 75);
|
||||
c = 48 + (Anope::RandomNumber() % 75);
|
||||
while (!isalnum(c));
|
||||
id += c;
|
||||
}
|
||||
|
||||
@@ -557,10 +557,6 @@ Conf::Conf() : Block("")
|
||||
}
|
||||
}
|
||||
Anope::CaseMapRebuild();
|
||||
|
||||
/* Check the user keys */
|
||||
if (!options->Get<unsigned>("seed"))
|
||||
Log() << "Configuration option options:seed should be set. It's for YOUR safety! Remember that!";
|
||||
}
|
||||
|
||||
Conf::~Conf()
|
||||
|
||||
@@ -494,10 +494,6 @@ bool Anope::Init(int ac, char **av)
|
||||
/* Initialize multi-language support */
|
||||
Language::InitLanguages();
|
||||
|
||||
/* Initialize random number generator */
|
||||
block = Config->GetBlock("options");
|
||||
srand(block->Get<unsigned>("seed") ^ time(NULL));
|
||||
|
||||
/* load modules */
|
||||
Log() << "Loading modules...";
|
||||
for (int i = 0; i < Config->CountBlock("module"); ++i)
|
||||
|
||||
+11
-1
@@ -20,7 +20,9 @@
|
||||
#include "sockets.h"
|
||||
|
||||
#include <cerrno>
|
||||
#include <climits>
|
||||
#include <numeric>
|
||||
#include <random>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
#ifndef _WIN32
|
||||
@@ -745,10 +747,18 @@ Anope::string Anope::Random(size_t len)
|
||||
};
|
||||
Anope::string buf;
|
||||
for (size_t i = 0; i < len; ++i)
|
||||
buf.append(chars[rand() % sizeof(chars)]);
|
||||
buf.append(chars[Anope::RandomNumber() % sizeof(chars)]);
|
||||
return buf;
|
||||
}
|
||||
|
||||
int Anope::RandomNumber()
|
||||
{
|
||||
static std::random_device device;
|
||||
static std::mt19937 engine(device());
|
||||
static std::uniform_int_distribution<int> dist(INT_MIN, INT_MAX);
|
||||
return dist(engine);
|
||||
}
|
||||
|
||||
// Implementation of https://en.wikipedia.org/wiki/Levenshtein_distance
|
||||
size_t Anope::Distance(const Anope::string &s1, const Anope::string &s2)
|
||||
{
|
||||
|
||||
+1
-1
@@ -224,7 +224,7 @@ uint64_t NickCore::GetId()
|
||||
// Generate a random key for SipHash.
|
||||
char key[16];
|
||||
for (auto &chr : key)
|
||||
chr = rand() % CHAR_MAX;
|
||||
chr = Anope::RandomNumber() % CHAR_MAX;
|
||||
|
||||
uint64_t newid = Anope::SipHash24(secretid.c_str(), secretid.length(), key);
|
||||
nickcoreid_map::const_iterator it = NickCoreIdList.find(newid);
|
||||
|
||||
+1
-1
@@ -249,7 +249,7 @@ Anope::string XLineManager::GenerateUID()
|
||||
{
|
||||
char c;
|
||||
do
|
||||
c = (rand() % 75) + 48;
|
||||
c = (Anope::RandomNumber() % 75) + 48;
|
||||
while (!isupper(c) && !isdigit(c));
|
||||
id += c;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user