`window.crypto.getRandomValues` with fallback to Node.js crypto