Learning R: Build a Password Generator
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
It is not easy to create secure passwords. The best way is to let a computer do it by randomly combining lower- and upper-case letters, digits and other printable characters.
If you want to learn how to write a small function to achieve that read on!
The exact task is again taken from Rosetta Code:
Create a password generation program which will generate passwords containing random ASCII characters from the following groups:
lower-case letters: a ──► z
upper-case letters: A ──► Z
digits: 0 ──► 9
other printable characters: !”#$%&'()*+,-./:;?@[]^_{|}~
(the above character list excludes white-space, backslash and grave)The generated password(s) must include at least one (of each of the four groups):
lower-case letter,
upper-case letter,
digit (numeral), and
one “other” character.The user must be able to specify the password length and the number of passwords to generate.
The passwords should be displayed or written to a file, one per line.
The randomness should be from a system source or library.
The program should implement a help option or button which should describe the program and options when invoked.
As often in our “Learning R” posts (for more see here: Category: Learning R) we will give a few hints but give you the chance to solve it yourself (to not spoil the fun) before showing a possible solution:
- Create a function with the arguments
nl
for the password length andnpw
for the number of passwords to be created. Also, include a logicalhelp
for the help functionality:passwords <- function(nl = 8, npw = 1, help = FALSE) {}
- Use an
if
statement to return some text if help is true - Use a
for
loop for creatingnpw
passwords - Use
letters
,LETTERS
,0:9
andc("!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "", "?", "@", "[", "]", "^", "_", "{", "|", "}", "~")
for the different groups - Use the
sample
function for sampling from the four different groups - Start by sampling from each of the four groups to ensure that you include at least one of each
- Use
cat(..., "\n", sep = "")
for printing the passwords
This should be more than enough help, now please try to build the function yourself!
Here I give one possible solution (which I also posted on Rosetta Code):
passwords <- function(nl = 8, npw = 1, help = FALSE) { if (help) return("gives npw passwords with nl characters each") if (nl < 4) nl <- 4 spch <- c("!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "<", "=", ">", "?", "@", "[", "]", "^", "_", "{", "|", "}", "~") for(i in 1:npw) { pw <- c(sample(letters, 1), sample(LETTERS, 1), sample(0:9, 1), sample(spch, 1)) pw <- c(pw, sample(c(letters, LETTERS, 0:9, spch), nl-4, replace = TRUE)) cat(sample(pw), "\n", sep = "") } } set.seed(123) passwords(help = TRUE) ## [1] "gives npw passwords with nl characters each" passwords(8) ## S2XnQoy* passwords(14, 5) ## :.iJ=Q7_gP?Cio ## !yUu7OL|eH;}1p ## y2{DNvV^Zl^IFe ## [email protected];I*] ## 6M+{)xV?i|1UJ/
When you compare that to most of the other solutions in different programming languages shown on the Rosetta Code page you will appreciate how very powerful R is!
If you have any questions or suggestions please let me know in the comments.
Hope you learned something new today, stay tuned!
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.