前端 JS生成32位UUID (安全的随机数)

打印 上一主题 下一主题

主题 905|帖子 905|积分 2715

JavaScript的Math.random()实现PRNG(伪随机数序列发生器),该PRNG是可移植和可重复的,因此如果两个Math.random()利用相同的种子,会生成相同的数值序列。
比方:下面的代码利用Math.random()
  1. //创建的Token很容易被猜到。
  2. function getToken (){
  3. var token =
  4. Math.random();
  5. return token;
  6. }
  7. `
复制代码
JavaScript在安全性要求较高的环境中生成随机数,通例的建议是利用 Mozilla API 中的**window.crypto.getRandomValues()**函数,但这种方法受限于欣赏器的兼容性,只在较新的版本(Chrome>=11.0,
Firefox>=21, Edge, IE>=11,
Safari>=3.1)可以利用。如果考虑到旧版本欣赏器,则应在javascript之外处理PRNG功能。
  1. /**
  2. * @description: 生成随机数0-255
  3. * @param {num} 最大值
  4. */
  5. export const random8bitValue = (num) => {
  6.   // 创建一个长度为1的Uint8Array类型数组
  7.   let randomValues = new Uint8Array(1);
  8.   // 使用window.crypto.getRandomValues()方法填充数组
  9.   window.crypto.getRandomValues(randomValues);
  10.   // 获取0到num的随机整数
  11.   let randomInteger = num ? randomValues[0] % num : randomValues[0];
  12.   return randomInteger;
  13. };
  14. /**
  15. * @description: 生成随机数0-4294967295(2^32-1)
  16. * @param {num} 最大值
  17. */
  18. export const random32bitValue = (num) => {
  19.   // 创建一个长度为1的Uint8Array类型数组
  20.   let randomValues = new Uint32Array(1);
  21.   // 使用window.crypto.getRandomValues()方法填充数组
  22.   window.crypto.getRandomValues(randomValues);
  23.   // 获取0到num的随机整数
  24.   let randomInteger = num ? randomValues[0] % num : randomValues[0];
  25.   return randomInteger;
  26. };
  27. /**
  28. * @description: 生成32位 uuid 8-4-4-4-12的格式
  29. */
  30. export const generateUUID = () => {
  31.   let data = new Uint8Array(16);
  32.   window.crypto.getRandomValues(data);
  33.   let uuid = Array.from(data)
  34.     .map((byte) => byte.toString(16).padStart(2, "0"))
  35.     .join("");
  36.   // 切割 8-4-4-4-12的格式
  37.   return (
  38.     uuid.slice(0, 8) +
  39.     "-" +
  40.     uuid.slice(8, 12) +
  41.     "-" +
  42.     uuid.slice(12, 16) +
  43.     "-" +
  44.     uuid.slice(16, 20) +
  45.     "-" +
  46.     uuid.slice(20)
  47.   );
  48. };
  49. /**
  50. * @description: 生成32位  a52d50373c9543fe9845821a1b1cfc00
  51. */
  52. export const generateUUID2 = () => {
  53. let uuid = Array.prototype.map.call(window.crypto.getRandomValues(new Uint8Array(16)), (item) => item.toString(16)).join("");
  54. if (uuid.length < 32) {
  55.   uuid += "0".repeat(32 - uuid.length); // 添加0补足位数
  56. }
  57. return uuid;
  58. };
复制代码
末了

从期间发展的角度看,网络安全的知识是学不完的,而且以后要学的会更多,同学们要摆正心态,既然选择入门网络安全,就不能仅仅只是入门程度而已,能力越强时机才越多。
因为入门学习阶段知识点比力杂,以是我讲得比力笼统,大家如果有不懂的地方可以找我咨询,我包管知无不言言无不尽,需要相关资料也可以找我要,我的网盘里一大堆资料都在吃灰呢。
干货主要有:
①1000+CTF历届题库(主流和经典的应该都有了)
②CTF技术文档(最全中文版)
③项目源码(四五十个风趣且经典的练手项目及源码)
④ CTF大赛、web安全、渗透测试方面的视频(适当小白学习)
⑤ 网络安全学习路线图(告别不入流的学习)
⑥ CTF/渗透测试工具镜像文件大全
⑦ 2023密码学/隐身术/PWN技术手册大全
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表