Post-It Güvenlik


16

Bildiğiniz gibi, bilgisayar korsanları her yerde ve her şeyi kesmek istiyorlar. Herhangi bir hacker'ı durduracak parola gereksinimleri yapmanız istendi . Sorun şu ki, patronunuz LOC için ödeme yapmanın kötü olduğunu duymuş ve muhtemelen çalışabilecek en basit şeyi yazabilmeniz için ayda eklenen $ 1800 - 0.03 * karakter ödüyor. Bu nedenle, az sayıda karakter kullanmanız (umarım çok küçük) ya da başka şekilde nakit unutmanız gerekir. Ayrıca, patronunuz hangi dili kullanacağınız umurumda değil.

İyi parolalara ilişkin gereksinimler, söz konusu makalede belirtilenlere benzer, ancak çözümün harici dosyalara bağımlı olmasını önlemek için sözlük tabanlı gereksinimler kaldırıldı, harflerin yeniden düzenlenmesini kontrol etmek zorunda değilsiniz (Gerçekten ne anlama geldiğini anlamak zor), son kural kaldırılır (3/4 nedir?) ve eski şifreleri kontrol etmez.

Bağlantılı makaleden belirli gereksinimleri kaldırdıktan sonra kesin gereksinimler şunlardır:

  • en az 8 karakter olmalı!
  • 12 karakterden uzun olmamalıdır!
  • büyük ve küçük harfleri var!
  • 8'den fazla büyük harf içermez!
  • 8'den fazla küçük harf içermez!
  • en az 2 harfiniz var!
  • önde gelen bir mektup var!
  • en az 1 rakamınız var!
  • kullanıcı adınız değil!
  • kullanıcı adınız geri değil!
  • kullanıcı adınızı içermiyor!
  • kullanıcı adınızı geriye doğru içermez!
  • en fazla 1 çift karakter tekrarlayın!
  • aynı karakterin 3 oluşumu yok !
  • karat içermez (^)
  • boşluk içermiyor
  • içermez =
  • kontamine değil &
  • dahil değil #
  • dahil değil ,
  • kontamine değil ;
  • dahil değil "
  • içermez>
  • içermiyor <
  • dahil değil [
  • içermez |
  • dahil değil )

Bu listedeki tüm yazım hataları olduğu gibi bırakılmıştır.

$ ./checkpass
Username: John
Password: L!]E2m69
OK.

$ ./checkpass
Username: John
Password: JohnnhoJ12
Nope.

$ ./checkpass
Username: JOE.smith
Password: JOE!smith123
OK.

En kısa kod para kazanır (JPG dosyası olarak gönderilir). "Kullanıcı adı:" ve "Şifre:" istemlerini göstermeli ve tam mesajla yanıt vermelidir.


1
Güzel, Günlük WTF makalesinde bir kod golf meydan okuma, +1 ;-)
ChristopheD

1
İlk örnek başarısız olmalıdır ("büyük ve küçük harf içermelidir!"), Değil mi?
Howard

@Howard: Parolada hem büyük hem de küçük harflere ihtiyaç duyulduğu anlamına gelir. Kelime "değil" dikkat edin.
Konrad Borowski

Bazı fontlarda, ilk paroladaki l'in küçük harfli bir el olduğu ve bir numaralı olmadığı çok açık değil, bu yüzden onu belirsiz bir küçük harfle değiştirmek için düzenliyorum.
Peter Taylor

@PeterTaylor Ah, teşekkür ederim. Gerçekten de 1ell yerine (basamak bir) olarak okudum .
Howard

Yanıtlar:


8

Perl, 203 194 189 193 karakter

İşte benim Perl sorunu ele almak:

print"Username: ";chop($u=<>);$n=reverse$u;print"Password: ";$_=<>;
say/^\pL.{7,11}$/*/\d/*/[A-Z]/*9>y/A-Z//&y/a-z//<9*/[a-z]/*
!/[" #,;->^&[|)]|(.)(.*\1.*\1|\1.*(.)\3)|\Q$u\E|\Q$n/?"OK.":"Nope."

Normal ifadeler, sırayla, parola:

  • bir harfle başlar, sekiz ila on iki karakter içerir

  • bir rakam içeriyor

  • büyük harf içeriyor

  • sekiz veya daha az büyük harfe sahip

  • sekiz veya daha az küçük harfe sahip

  • küçük harf içeriyor

  • yasaklanmış noktalama işaretlerinden hiçbirini, herhangi bir karakterin üç tekrarını, iki katına çıkmış bir karakterin birden fazla tekrarını, kullanıcı adını veya tersine çevrilmiş kullanıcı adını içermez.

(Peter Taylor'a 189 karakterlik versiyondaki bir hataya işaret ettiği için teşekkürler.)


Bunu ideone üzerinde nasıl çalıştıracağımı anladım use v5.10;ve başarısız oldu "normal ifadeler düzgün bir şekilde kaçtı mı?" Bkz. İdeone.com/QKFnZ
Peter Taylor

@PeterTaylor: Ruby hakkında bilmiyorum, ama Perl düzeltmesinde \Q$u\E|\Q$n( \Ebu bölüm sonuna kadar hareket ettirilirse son atlanabilir).
Konrad Borowski

OTOH Sanırım bir karakter tekrarları bir araya getirerek kaydedilebileceğini düşünüyorum (.)(.*\1.*\1|\1.*(.)\3)(test edilmedi - ideone ile tam bir test pili yazmayı denemeyeceğim).
Peter Taylor

5

Ruby, 270 karakter

$><<"Username: ";u=gets.chop
$><<"Password: ";gets
puts ('^.{8,12}$+\p{Lower}+\p{Upper}+^(\p{Alpha}.*){2}+\d+(\p{Lower}.*){9}+(\p{Upper}.*){9}+(.)\1.*(.)\2+(.).*\1.*\1+[ ^=&#,;"<>\[|)]+'+u+?++u.reverse).split(?+).map{|r|/#{r}/=~$_??A:?B}*""=="AAAAABBBBBBB"?"OK.":"Nope."

On iki düzenli ifadeye dayanan yakut bir uygulama. Her ifade ya bir pozitif eşleşme (ilk beş) ya da negatif bir ifadedir (son yedi). Kısıtlama olarak, kullanıcı adı yalnızca harf veya rakam içerebilir.

Pozitif düzenli ifade eşleşmeleri:

  • /^.{8,12}$/: en az 8 karakter olmalı!, 12 karakterden daha uzun olamaz!
  • /\p{Lower}/ve /\p{Upper}/: büyük ve küçük harfleri olan!
  • /^(\p{Alpha}.*){2}/: en az 2 harf!
  • /\d/: en az 1 rakamınız var!

Negatif normal ifade eşleşmeleri:

  • /(\p{Lower}.*){9}/: en fazla 8 küçük harf kullanın!
  • /(\p{Upper}.*){9}/: en fazla 8 büyük harf içermelidir!
  • /(.)\1.*(.)\2/: en fazla 1 çift karakter tekrarlayın!
  • /(.).*\1.*\1/: aynı karakterin 3 oluşumu yok!
  • /[ ^=&#,;"<>\[|)]/: düzeltme işareti, boşluk, =, &, #, ,,;, ",>, <, [, |,) içermez
  • /#{u}/: kullanıcı adınız değil!, kullanıcı adınızı içermez!
  • /#{u.reverse}/: geriye doğru kullanıcı adınız olmayacak!, geriye doğru kullanıcı adınızı içermez!

Bu, kullanıcı adından kaçmaz, bu nedenle mükemmel şekilde geçerli bir şifre reddedilebilir. İdeone.com/bPpeo
Peter Taylor

@PeterTaylor Bu yüzden cevabımdaki kullanıcı adları kısıtlamasını not ettim.
Howard

1

Python 3, 291 bayt / karakter

from re import*
n,p=map(input,["Username: ","Password: "])
c,U,L=lambda x:len(split("[%s]"%x,p)),"A-Z","a-z"
print(["OK.","Nope."][any([8>len(p)>12,2>c(U)>9,2>c(L)>9,3>c(U+L),match(U+L,p),2>c("0-9"),n in p,n[::-1]in p,any(c(x)>3 for x in p),len(findall("(.)\\1",p))>1,c(' ^=&#,;"><[|)')>1])])

Daha güzel biçimlendirilmiş ve yorumlanmış:

# import all elements from the regular expression module
from re import *

# Get the two lines of user input (username `n`, password `p`):
n, p = map(input, ["Username: ","Password: "])

# Assign some internally useful shortcuts (uppercase letters `U`, lowercase letters `L`):
# `c(x)` counts the occurrences of pattern `x` in the password `p` plus 1
c, U, L = lambda x: len(split("[%s]" % x, p)), "A-Z", "a-z"

# Print the test result: `"OK."` if the `any(...)` function returned `False`, else `"Nope."`.
# The `any(...)` combines the result of all enclosed checks and returns `True` if at least
# one of the checks failed (returned `True`).
print(["OK.", "Nope."][any([                                # vvv--- CHECKS: ---vvv
                             8>len(p)>12,                   # password length 8-12
                             2>c(U)>9,                      # 1-8 uppercase letters
                             2>c(L)>9,                      # 1-8 lowercase letters
                             3>c(U+L),                      # at least 2 letters
                             match(U+L,p),                  # starts with a letter
                             2>c("0-9"),                    # at least 1 digit
                             n in p,                        # username is not (in) the pw.
                             n[::-1]in p,                   # reversed name not (in) the pw.
                             any(c(x)>3 for x in p),        # at most 3 same characters
                             len(findall("(.)\\1",p))>1,    # at most 1 pair (e.g. "AA")
                             c(' ^=&#,;"><[|)')>1])         # does not contain special char.
                           ])

Bu çözümü ideone.com'da bulabilirsiniz , ancak çıktı önceden tanımlanmış girişi göstermediği veya hatta satır sonları göstermediği için çıktı biraz çirkin görünüyor. Ayrıca, kullanıcı adı-şifre kombinasyonu "JOE.smith"- "JOE!smith123"şu anda sabit giriş verisi olarak girilmektedir.
Hata ayıklama çıktısı olarak tüm denetimlerin bir dökümünü ekledim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.