W tym pytaniu Erik musi wygenerować bezpieczny losowy token w Node.js. Istnieje metoda, crypto.randomBytes
która generuje losowy bufor. Jednak kodowanie base64 w węźle nie jest bezpieczne dla adresu URL, obejmuje /
i +
zamiast -
i _
. Dlatego najprostszym sposobem na wygenerowanie takiego tokena, jaki znalazłem, jest
require('crypto').randomBytes(48, function(ex, buf) {
token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
});
Czy istnieje bardziej elegancki sposób?
javascript
node.js
base64
securestring
Hubert OG
źródło
źródło
'a-zA-Z0-9_-'
).Odpowiedzi:
Spróbuj crypto.randomBytes () :
Kodowanie „hex” działa w węźle v0.6.x lub nowszym.
źródło
node -e "require('crypto').randomBytes(48, function(ex, buf) { console.log(buf.toString('hex')) });"
buf.toString('base64')
aby uzyskać numer zakodowany w Base64.Opcja synchroniczna w przypadku, jeśli nie jesteś ekspertem JS takim jak ja. Musiałem poświęcić trochę czasu na dostęp do zmiennej funkcji wbudowanej
źródło
const generateToken = (): Promise<string> => new Promise(resolve => randomBytes(48, (err, buffer) => resolve(buffer.toString('hex'))));
0. Korzystanie z biblioteki stron trzecich nanoid [NOWOŚĆ!]
https://github.com/ai/nanoid
1. Kodowanie podstawowe 64 za pomocą bezpiecznego alfabetu URL i nazwy pliku
Strona 7 RCF 4648 opisuje sposób kodowania w bazie 64 z bezpieczeństwem adresów URL. Do wykonania zadania możesz użyć istniejącej biblioteki, takiej jak base64url .
Funkcja będzie:
Przykład użycia:
Zauważ, że zwrócona długość łańcucha nie będzie zgodna z argumentem size (size! = Długość końcowa).
2. Losowe wartości kryptograficzne z ograniczonego zestawu znaków
Możesz również zbudować silny ciąg losowy z ograniczonego zestawu takich znaków:
Przykład użycia:
źródło
Aktualny właściwy sposób, aby to zrobić asynchronicznie przy użyciu standardów asynchronicznych i oczekujących na ES 2016 (od Node 7) byłby następujący:
Działa to natychmiast po wyjęciu z pudełka w węźle 7 bez żadnych transformacji Babel
źródło
Bezpieczny ciąg losowego adresu URL i nazwy pliku (1 linijka)
źródło
Sprawdzić:
źródło
ceil
islice
są konieczne dla pożądanych długości, które są nieparzyste. W przypadku równych długości nic nie zmieniają.Z asynchronizacją / czekaniem i promisification .
Generuje coś podobnego do
VjocVHdFiz5vGHnlnwqJKN0NdeHcz8eM
źródło
Spójrz na
real_ates
sposób ES2016, jest bardziej poprawny.Sposób ECMAScript 2016 (ES7)
Generator / Yield Way
źródło
https://www.npmjs.com/package/crypto-extra ma na to sposób :)
źródło
.randomString (length, charset)
(patrz dokumentacja ). Możesz na przykład użyć użytkownikacrypto.randomString(12)
.Moduł npid anyid zapewnia elastyczny interfejs API do generowania różnego rodzaju ciągów znaków / kodów.
Aby wygenerować losowy ciąg znaków w A-Za-z0-9 przy użyciu 48 losowych bajtów:
Aby wygenerować ciąg alfabetu o stałej długości wypełniony losowymi bajtami:
Wewnętrznie używa
crypto.randomBytes()
do generowania losowego.źródło
Oto wersja asynchroniczna wzięta dosłownie z góry odpowiedzi @Yves M.
źródło
Prosta funkcja, która daje tokenowi bezpieczny adres URL i kodowanie base64! To połączenie 2 odpowiedzi z góry.
źródło