Функция генерации случайного пароля

Я хочу создать случайный пароль для сотрудников с функцией ниже. Это моя первая попытка с функциями в R. Поэтому мне нужна небольшая помощь.

genPsw <- function(num, len=8) {
          # Vorgaben für die Passwortkonventionen festlegen
            myArr  <- c("", 2, 3, 4, 5, 6, 7, 8, 9, "A", "B", 
                        "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", 
                        "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", 
                        "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o",
                        "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
                        "!", "§", "$", "%", "&", "(", ")", "*")
          # replicate is a wrapper for the common use of sapply for repeated evaluation of an expression 
          # (which will usually involve random number generation).
            replicate(num, paste(sample(myArr, size=len, replace=T), collapse=""))
          # nrow of dataframe mitarbeiter 
          dim_mitarbeiter <- nrow(mitarbeiter)
          for(i in 1:dim_mitarbeiter) {
                        # Random Number Generation with i
                          set.seed(i)
                        # Generate Passwort for new variable password
                        mitarbeiter$passwort <- genPsw(i)                
          }

}

С формой ответа Floo0 я изменил эту функцию на что-то подобное, но она не работает:

genPsw <- function(num, len=8) {
          # Vorgaben für die Passwortkonventionen festlegen
          sam<-list()
          sam[[1]]<-1:9
          sam[[2]]<-letters
          sam[[3]]<-LETTERS
          sam[[4]]<-c("!", "§", "$", "%", "&", "(", ")", "*")

          # nrow of dataframe mitarbeiter 
          dim_mitarbeiter <- nrow(mitarbeiter)
          for(i in 1:dim_mitarbeiter) {
                        # Random Number Generation with i
                            tmp<-mapply(sample,sam,c(2,2,2,2))
                         # Generate Passwort for new variable password
                        mitarbeiter$passwort <- paste(sample(tmp),collapse="")
          }

}

Ответ 1

Что насчет

samp<-c(2:9,letters,LETTERS,"!", "§", "$", "%", "&", "(", ")", "*")
paste(sample(samp,8),collapse="")
Результат

выглядит примерно так:

"HKF§VvnD"

Внимание: Этот подход не предусматривает наличия капиталов, цифр и неапдовых числовых символов

EDIT:

Если вы хотите принудительно ввести определенное количество столиц, цифр и не-буквенных символов, вы можете пойти с этим:

sam<-list()
sam[[1]]<-1:9
sam[[2]]<-letters
sam[[3]]<-LETTERS
sam[[4]]<-c("!", "§", "$", "%", "&", "(", ")", "*")

tmp<-mapply(sample,sam,c(2,2,2,2))
paste(sample(tmp),collapse="")

Где c(2,2,2,2) указывает количество цифр, букв, заглавных букв и симбиль (в этом порядке). Результат:

[1] "j$bP%5R3"

EDIT2: Чтобы создать новый столбец в таблице mitarbeiter, просто используйте

passwort<-replicate(nrow(mitarbeiter),paste(mapply(sample,sam,c(2,2,2,2)),collapse=""))
mitarbeiter$passwort<-passwort

Ответ 2

Существует функция, которая генерирует случайные строки в stringi package:

require(stringi)
stri_rand_strings(n=2, length=8, pattern="[A-Za-z0-9]")
## [1] "90i6RdzU" "UAkSVCEa"

Ответ 3

Это может сработать, можно было бы изменить ASCII, чтобы избежать нежелательных символов:

generatePwd <- function(plength=8, ASCII=c(33:126)) paste(sapply(sample(ASCII, plength), function(x) rawToChar(as.raw(x))), collapse="")

Ответ 4

Ниже script создает пароль указанной длины из комбинации букв верхнего и нижнего регистра, цифр и 32 символов (пунктуация и т.д.).

# Store symbols as a vector in variable punc
R> library(magrittr) # Load this package to use the %>% (pipe) operator
R> punc_chr <- "!#$%&’()*+,-./:;<=>[email protected][]^_`{|}~" %>%
     str_split("", simplify = TRUE) %>%
     as.vector() -> punc

# Randomly generate specified number of characters from 94 characters
R> sample(c(LETTERS, letters, 0:9, punc), 8) %>%
     paste(collapse = "") -> pw
R> pw # Return password
[1] "fAXVpyOs"

Ответ 5

Мне нравится краткость L.R. решение, хотя я не следую тому, что он делает на 100%.

Мое решение позволяет указать длину пароля, но также обеспечивает включение хотя бы одного нижнего регистра, одного верхнего регистра, одного числового и одного специального символа и позволяет воспроизводить. (ht to moazzem для написания всех специальных символов.)

gen_pass <- function(len=8,seeder=NULL){
  set.seed(seeder) # to allow replicability of passw generation
 # get all combinations of 4 nums summing to length len
  all_combs <- expand.grid(1:(len-3),1:(len-3),1:(len-3),1:(len-3))
  sum_combs <- all_combs[apply(all_combs, 1, function(x) sum(x)==len),]
 # special character vector
  punc <- unlist(strsplit("!#$%&’()*+,-./:;<=>[email protected][]^_`{|}~",""))
 # list of all characters to sample from
  chars <- list(punc,LETTERS,0:9,letters)
 # retrieve the number of characters from each list element 
 # specified in the sampled row of sum_combs
  pass_chars_l<- mapply(sample, chars,
                        sum_combs[sample(1:nrow(sum_combs),1),],
                        replace = TRUE)
 # unlist sets of password characters 
  pass_chars <- unlist(pass_chars_l)
 # jumble characters and combine into password 
  passw <- str_c(sample(pass_chars),collapse = "")
 return(passw)
}

Мне все еще интересно, как (1:(len-3),1:(len-3),1:(len-3),1:(len-3)) в expand.grid(1:(len-3),1:(len-3),1:(len-3),1:(len-3)) можно выразить более элегантно?