C#中随机字符串生成:从新手到专家

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

我厌倦了搜索"random alphanumeric string C#"并写了这篇文章

\n\n

老实说:当你再次需要生成随机激活码、临时密码或会话唯一标识符时,你是不是直接复制了Stack Overflow上的第一个答案?我也曾这样做过。但问题是,C#中生成随机字母数字字符串并非单一任务,而是一系列场景。适用于测试令牌的方法,在生产环境中可能会让安全审计失败。

\n\n

在本文中,我们将分析所有流行的C#随机字符串生成方法。从使用Random的简单方案到经OWASP批准的加密安全方法。你将了解哪种方法适合密码,哪种适合URL短链接,哪种最好彻底忘记。开始吧!

\n\n

1. 最简单的方法:Random + StringBuilder(但有一个注意事项)

\n\n

当我刚开始时,我的第一个解决方案是以下代码:

\n\n
public static string GenerateRandomString(int length)\n{\n    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";\n    var random = new Random();\n    var result = new StringBuilder(length);\n    \n    for (int i = 0; i < length; i++)\n    {\n        result.Append(chars[random.Next(chars.Length)]);\n    }\n    \n    return result.ToString();\n}
\n\n

看起来合理,对吧?我们取一个字符集,随机选取索引,构建字符串。但这种方法有两个严重问题:

\n\n
    \n
  • 不安全的Random——Random类不是加密安全的。如果攻击者知道对象创建的时间(这很容易),他们可以预测整个序列。
  • \n
  • 多线程问题——如果两个线程同时使用相同的种子调用new Random()(在快速连续调用中经常发生),它们将得到相同的字符串。
  • \n
\n\n

何时使用:仅用于本地测试、生成文件名或调试数据。绝不要用于密码、令牌或加密密钥。

\n\n

改进版本:静态Random

\n\n
private static readonly Random _random = new Random();\n\npublic static string GenerateRandomString(int length)\n{\n    const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";\n    var result = new char[length];\n    \n    lock (_random)\n    {\n        for (int i = 0; i < length; i++)\n        {\n            result[i] = chars[_random.Next(chars.Length)];\n        }\n    }\n    \n    return new string(result);\n}
\n\n

我们添加了lock以实现线程安全,并将StringBuilder替换为char数组——这样更快。但可预测性问题仍然存在。

\n\n

2. Guid.NewGuid():一行代码生成随机字符串

\n\n

当我第一次看到这个技巧时,我想:“太天才了!”

\n\n
string randomString = Guid.NewGuid().ToString("N").Substring(0, 8);
\n\n

Guid生成一个128位的值,几乎保证唯一。"N"方法去掉连字符。Substring截取到所需长度。

\n\n

优点:

\n
    \n
  • 代码非常简短
  • \n
  • 无需处理字符集
  • \n
  • 速度快
  • \n
\n\n

缺点:

\n
    \n
  • Guid仅包含十六进制字符(0-9, a-f)——字符集只有16个字符
  • \n
  • 并非所有版本的Guid都是真正随机的(版本1基于时间和MAC地址)
  • \n
  • 不适用于加密——Guid结构可预测
  • \n
\n\n

何时使用:用于生成数据库记录的唯一标识符或临时文件名。不用于密码。

\n\n

3. Path.GetRandomFileName():随机文件名

\n\n

很少有人知道,.NET已经内置了随机文件名生成器:

\n\n
<                

博客

书籍推荐