If you need help building a random password, you should check out pctools.com random password generator. It’s great, it gives you a lot of options and you can have it generate a list of 50 passwords with their callsign spellings in seconds. I’ve found the callsign spelling to be very helpful for remembering and recognizing all the characters in a new password I generate. I liked this solution so much, I decided port this concept over to C# with a set of helpers. This can be used anywhere you want to generate a password, I am currently using it in a ASP.NET LOB app to suggest and show better passwords options.

Generating Random Passwords

[sourcecode language=”csharp”]
using System;
using System.Collections.Generic;
using System.Linq;

public static class StringHelper
// Shared Static Random Generator
private static readonly Random CommonRandom = new Random();

public static string GenerateRandomPassword(int passwordLength, bool canRepeatCharacters = false)
char[] chars = "$%#@!*abcdefghijklmnopqrstuvwxyz1234567890?;:ABCDEFGHIJKLMNOPQRSTUVWXYZ^&".ToCharArray();

string randomPassword = string.Empty;

for (int l = 0; l < passwordLength; l++)
int x = CommonRandom.Next(1, chars.Length);

if (canRepeatCharacters || !randomPassword.ToCharArray().Any(ch => ch == chars[x]))
randomPassword += chars[x].ToString();

return randomPassword;

public static List<string> GenerateRandomPasswords(int quantity, int passwordLength = 8)
List<string> passwords = new List<string>();

for (int i = 0; i < quantity; i++)

return passwords;

There are a few options on the generator, like not repeating a character and configuring the password length. In addition to the main method, I also have a helper that also returns a list of multiple passwords, to return in a list to give your users options.

Important note, Random() is not very random when your making quick consecutive calls. If you want to call Random() in a loop, you should move your instance of the Random() class to the outside to prevent duplicate seeds, which will result in duplicate passwords.

[sourcecode language=”csharp”]
public static string GetCallsignSpelling(string password)
if (string.IsNullOrEmpty(password))
return string.Empty;

Dictionary<char, string> callsigns = new Dictionary<char, string>()
{‘$’,"Dollar Symbol"},
{‘%’,"Percent Symbol"},
{‘#’,"Number Symbol"},
{‘@’,"At Symbol"},
{‘!’,"Exclamation Symbol"},
{‘*’,"Asterisk Symbol"},
{‘?’,"Question Symbol"},
{‘;’,"SemiColon Symbol"},
{‘:’,"Colon Symbol"},
{‘^’,"Caret Symbol"},
{‘&’,"Ampersand Symbol"}

char[] wordCharacters = password.ToCharArray();

string callsignSpelling =
(current, passwordCharacter) =>
current + (callsigns[passwordCharacter] + " – ")).TrimEnd(‘ ‘, ‘-‘);

return callsignSpelling;

The spelling is done using a Key/Value dictionary, and iterating over each character of the password one-by-one.

The result of using these two helpers is below.