R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Salasanageneraattori

Väkersin R:ään pienen salasanageneraattorin. Tavoitteena on muodostaa helposti muistettavia salasanoja. Salasanan voi kirjoittaa vaikka lapulle muistiin, jos jättää siitä esimerkiksi palvelun tunnisteen ja vakiomerkkijonon kirjoittamatta. Nämä on yleensä melko helppo muistaa muutenkin.

Näitä generaattoreitahan on toki muutenkin verkko pullollaan, mutta tässä on erikoispiirteenä se, että taustalla olevaa sanalistaa voi tarvittaessa vaihtaa. Alla olevassa esimerkissä käytetään kotuksen sanalistaa, joka löytyy sopivassa muodossa mm. Oppitori-blogista.

Oletusarvoinen metodi (compound) perustuu siihen, että sanalistasta valitaan satunnaisesti määrätty määrä sanoja (lenght), joista valinnaisesti muutetaan aina ensimmäinen kirjain isoksi (capitalize). Lopuksi nämä sanat laitetaan peräkkäin, ja näin muodostuu lopullinen salasana. Lisäksi on mahdollista liittää salasanan alkuun esimerkiksi jonkin palvelun tunniste (prefix) ja loppuun jokin vakiomerkkijono (postfix). Lisäksi salasanan arpomiseen käytettävää siemenlukua voidaan vaihtaa optiolla seed. Tämä mahdollistaa myös sen, että salasanat on mahdollista kirjoittaa lapulle pelkillä numeroilla merkitsemällä, koska sama seed tuottaa aina saman salasanan, kunhan muut optiot ja sanalista säilyvät samoina. Salasanoista on myös mahdollista poistaa skandit (scands=FALSE), vaikka ne yleensä lisäävätkin salasanojen turvallisuutta, jos ajatellaan sanakirja- tai brute force-hyökkäyksiä.

Funktio näyttää seuraavalta:

#################################################################
# 
# 2014-02-07
# JTT
#
# Function pwdgen for generating random passwords
#
# method: compound, connect, random
# scand: TRUE, FALSE
# length: password length
# capitalize: first
# substr.len: length of substrings collapsed into the password
# prefix: prefix included in the password
# postfix: postfix included in the password
# pwd: password to be modified
# seed: random seed, allows replication
#
#################################################################
 
pwdgen<-function(method="compound", scands=TRUE, length=3, capitalize="first", substr.len=2, prefix="", postfix="", pwd="", seed=NULL) {
   if(!is.null(seed) & is.numeric(seed)) {
      set.seed(seed)
   }
 
   if(method=="compound") {
      pwd<-sample(kotus, length)
      if(capitalize=="first") {
         pwd<-gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", pwd, perl=TRUE)
      }
      pwd<-paste(pwd, collapse="")
   }
 
   if(method=="connect") {
      pwd<-sample(kotus, length)
      if(capitalize=="first") {
         pwd<-gsub("(^|[[:space:]])([[:alpha:]])", "\\1\\U\\2", pwd, perl=TRUE)
      }
      pwd<-substr(pwd, 1, substr.len)
      pwd<-paste(pwd, collapse="")
   }
 
   if(method=="random" & scands) {
      pwd<-paste(sample(c(letters, LETTERS, c("å", "ä", "ö", "Å", "Ä", "Ö"), 0:9, c("!", "?", ".", ",")), length), collapse="")
   }
   if(method=="random" & !scands) {
      pwd<-paste(sample(c(letters, LETTERS, 0:9, c("!", "?", ".", ",")), length), collapse="")
   }
 
   if(!scands) {
      pwd<-gsub("ö", "o", gsub("ä", "a", gsub("å", "a", pwd)))
   }
 
   pwd<-paste(prefix, pwd, postfix, sep="")
 
   pwd
}

Salasana voidaan arpoa esimerkiksi seuraavasti, kun sanalista on ensin ladattu R:n muistiin:

kotus<-readLines("http://dl.dropbox.com/u/19428234/kotus_sanat%2C%20per%C3%A4kk%C3%A4in.txt", encoding="UTF-8")
pwdgen(method="compound", scands=TRUE, length=5, capitalize="first", prefix="AAA", postfix="123", seed=7)
 
"AAAYlähankaLonkkahermosärkyHerhiläinenEpämiehekkäästiKeittiökaluste123"

Kuulostaa jokseenkin helposti muistettavalta: Keittiökaluisteet ovat kanittaneet yläosastaan, ja niitä on ajauduttu vaihtamaan epämiehekkäästi. Tämän vuoksi kokoajasta on tullut herhiläinen ja seuraavana aamuna on sitten ollut lonkassa hermosärkyä.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *