【问题标题】:Function to generate a random password生成随机密码的函数
【发布时间】:2014-03-06 08:32:53
【问题描述】:

我想用下面的函数为员工生成一个随机密码。这是我第一次尝试使用 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="")
          }

}

【问题讨论】:

  • 为了简化myArr,你可以使用R常量——LETTERSletters
  • 给他们所有的“正确的马电池主食”

标签: r string random


【解决方案1】:

以下脚本根据大小写字母、数字和 32 个符号(标点符号等)的组合创建指定长度的密码。

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

【讨论】:

    【解决方案2】:

    怎么样

    samp<-c(2:9,letters,LETTERS,"!", "§", "$", "%", "&", "(", ")", "*")
    paste(sample(samp,8),collapse="")
    

    结果是这样的

    "HKF§VvnD"
    

    注意: 此方法不强制使用大写字母、数字和非字母数字符号

    编辑:

    如果你想强制使用一定数量的大写、数字和非字母数字符号,你可以这样做:

    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
    

    【讨论】:

    • 您可以通过将 c(2,2,2,2) 替换为从 1:5 中随机选择的值 3 次来扩展此设置,然后分配第四个值 > 1 以达到所需的密码长度。
    • 我可以把它放在像 dim_mitarbeiter
    • 只需使用passwort&lt;-replicate(nrow(mitarbeiter),paste(mapply(sample,sam,c(2,2,2,2)),collapse="")),然后使用mitarbeiter$passwort&lt;-passwort
    【解决方案3】:

    stringi包中有生成随机字符串的函数:

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

    【讨论】:

    • stringi 也可以生成带有 §$%(可打印 ASCII)等字符的字符串吗?
    • 例如 asc.read
    【解决方案4】:

    这可能有效,可能需要更改 ASCII 以避免不需要的符号:

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

    【讨论】:

    • 您可能希望将 ´sample(ASCII, plength)´ 替换为 ´sample(ASCII, plength, replace=T)´
    【解决方案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("!#$%&’()*+,-./:;<=>?@[]^_`{|}~",""))
     # 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)
    }
    

    我还在想expand.grid(1:(len-3),1:(len-3),1:(len-3),1:(len-3))中的(1:(len-3),1:(len-3),1:(len-3),1:(len-3))怎么表达更优雅?

    【讨论】:

      【解决方案6】:

      我刚刚尝试了 Fmerhout 提出的功能。这似乎是一个很好的解决方案。多谢。但是因为最后一行代码:

          passw <- str_c (sample (pass_chars), collapse = "")    
      

      该功能不起作用。 我试过了:

          passw <- str (sample (pass_chars), collapse = "")     
      

      ...现在它可以工作了:

      带有种子的示例:

          >gen_pass(4,2)
      

      给出:chr [1:4] "y" "[" "O" "1"

      为了得到一个可以直接使用的密码,我把代码的结尾改成了这样:

          zz <- sample(pass_chars)
          passw <- paste(zz, sep = "", collapse = "")
          return(passw)
          }
      

      所以,现在我们得到例如:

          > gen_pass(35, 2)
          [1] "0OD}1O}8DKMqTL[JEFZBwKMJWGD’VZ=VRnD"
      

      这很有趣;因为我们只需要记住传递给函数的参数。在这里,在这种情况下:35 2。 谢谢 Fmerhout 先生

      总结:通过这个小脚本,我们有一个很好的方法来创建非常强大且非常安全的密码,并且具有良好的熵,而无需使用字典,也无需在任何地方记录我们的密码。

      【讨论】:

        猜你喜欢
        • 2021-12-28
        • 2010-09-08
        • 2012-11-06
        • 2020-03-02
        • 1970-01-01
        • 2015-04-13
        • 2012-07-28
        相关资源
        最近更新 更多