Dalam pertanyaan ini Erik perlu membuat token acak aman di Node.js. Ada metode crypto.randomBytes
yang menghasilkan Buffer acak. Namun, pengkodean base64 dalam node tidak aman-url, itu termasuk /
dan +
bukannya -
dan _
. Karena itu, cara termudah untuk menghasilkan token semacam itu yang saya temukan adalah
require('crypto').randomBytes(48, function(ex, buf) {
token = buf.toString('base64').replace(/\//g,'_').replace(/\+/g,'-');
});
Apakah ada cara yang lebih elegan?
javascript
node.js
base64
securestring
Hubert OG
sumber
sumber
'a-zA-Z0-9_-'
).Jawaban:
Coba crypto.randomBytes () :
Pengkodean 'hex' bekerja di node v0.6.x atau lebih baru.
sumber
node -e "require('crypto').randomBytes(48, function(ex, buf) { console.log(buf.toString('hex')) });"
buf.toString('base64')
untuk mendapatkan nomor yang disandikan Base64.Opsi sinkron kalau-kalau Anda bukan ahli JS seperti saya. Harus meluangkan waktu untuk mengakses variabel fungsi inline
sumber
const generateToken = (): Promise<string> => new Promise(resolve => randomBytes(48, (err, buffer) => resolve(buffer.toString('hex'))));
0. Menggunakan perpustakaan pihak ketiga nanoid [BARU!]
https://github.com/ai/nanoid
1. Basis 64 Pengkodean dengan URL dan Nama File Alfabet Aman
Halaman 7 dari RCF 4648 menjelaskan cara menyandikan di pangkalan 64 dengan keamanan URL. Anda dapat menggunakan perpustakaan yang ada seperti base64url untuk melakukan pekerjaan itu.
Fungsinya adalah:
Contoh penggunaan:
Perhatikan bahwa panjang string yang dikembalikan tidak akan cocok dengan argumen ukuran (ukuran! = Panjang akhir).
2. Nilai acak Crypto dari kumpulan karakter terbatas
Anda juga dapat membuat string acak yang kuat dari serangkaian karakter terbatas seperti itu:
Contoh penggunaan:
sumber
Cara tepat terkini untuk melakukan hal ini secara tidak sinkron menggunakan standar ES 2016 untuk async dan menunggu (mulai dari Node 7) adalah sebagai berikut:
Ini berfungsi di luar kotak di Node 7 tanpa transformasi Babel
sumber
URL acak dan string nama file aman (1 liner)
sumber
Periksa:
sumber
ceil
danslice
diperlukan untuk panjang yang diinginkan yang aneh. Bahkan untuk jangka panjang, mereka tidak mengubah apa pun.Dengan async / menunggu dan promisifikasi .
Menghasilkan sesuatu yang mirip
VjocVHdFiz5vGHnlnwqJKN0NdeHcz8eM
sumber
Lihatlah
real_ates
cara ES2016, itu lebih benar.Cara ECMAScript 2016 (ES7)
Generator / Cara Menghasilkan
sumber
https://www.npmjs.com/package/crypto-extra memiliki metode untuk itu :)
sumber
.randomString (length, charset)
(lihat dokumentasi ). Jadi Anda bisa pengguna misalnyacrypto.randomString(12)
.Modul npm anyid menyediakan API fleksibel untuk menghasilkan berbagai jenis string ID / kode.
Untuk menghasilkan string acak di A-Za-z0-9 menggunakan 48 byte acak:
Untuk menghasilkan alfabet panjang tetap, hanya string yang diisi oleh byte acak:
Secara internal itu digunakan
crypto.randomBytes()
untuk menghasilkan acak.sumber
Ini adalah versi async yang diambil secara verbatim dari jawaban @Yves M. di atas
sumber
Fungsi sederhana yang memberi Anda token yang aman URL dan memiliki encoding base64! Ini kombinasi dari 2 jawaban dari atas.
sumber