Bảo mật bởi Post-It


16

Như bạn có thể biết, tin tặc có ở khắp mọi nơi và chúng muốn hack mọi thứ. Bạn đã được yêu cầu thực hiện các yêu cầu mật khẩu sẽ ngăn chặn bất kỳ tin tặc . Vấn đề là, ông chủ của bạn đã nghe nói rằng trả tiền cho LỘC là xấu và anh ta trả cho bạn 1800 - 0,03 đô la * ký tự được chèn mỗi tháng để khiến bạn viết những điều đơn giản nhất có thể có thể làm việc. Vì vậy, bạn phải sử dụng số lượng ký tự nhỏ (hy vọng là rất nhỏ), hoặc nếu không thì quên tiền mặt. Ngoài ra, sếp của bạn không quan tâm bạn sẽ sử dụng ngôn ngữ nào.

Các yêu cầu cho mật khẩu tốt tương tự như các yêu cầu trong bài viết được đề cập, ngoại trừ các yêu cầu dựa trên từ điển đã bị xóa để tránh đưa ra giải pháp phụ thuộc vào các tệp bên ngoài, bạn không phải kiểm tra các chữ cái được sắp xếp lại (Khó hiểu ý nghĩa thực sự của nó), quy tắc cuối cùng được xóa (3/4 là gì?) và nó không kiểm tra mật khẩu cũ.

Các yêu cầu chính xác sau khi loại bỏ các yêu cầu nhất định khỏi bài viết được liên kết là:

  • có ít nhất 8 ký tự!
  • không được dài hơn 12 ký tự!
  • có ký tự chữ hoa và chữ thường!
  • không có quá 8 chữ cái viết hoa!
  • không có quá 8 chữ cái viết thường!
  • có ít nhất 2 chữ cái!
  • có một lá thư hàng đầu!
  • có ít nhất 1 chữ số!
  • không phải là tên người dùng của bạn!
  • không được tên người dùng của bạn ngược!
  • không chứa tên người dùng của bạn!
  • không chứa tên người dùng của bạn ngược!
  • không có nhiều hơn 1 cặp ký tự lặp lại!
  • không có 3 lần xuất hiện của cùng một nhân vật!
  • không chứa carat (^)
  • không chứa không gian
  • không chứa =
  • không phải conatain &
  • Không chứa #
  • Không chứa ,
  • không conatain ;
  • Không chứa "
  • không chứa>
  • không chứa <
  • Không chứa [
  • không chứa |
  • Không chứa )

Tất cả các lỗi chính tả trong danh sách này là trái.

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

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

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

Mã ngắn nhất sẽ thắng tiền (được gửi dưới dạng tệp JPG). Nó phải hiển thị lời nhắc "Tên người dùng:" và "Mật khẩu:" và trả lời với thông báo chính xác.


1
Nice, nhìn thấy một thách thức golf mã trong một bài báo hàng ngày WTF, 1 ;-)
ChristopheD

1
Ví dụ đầu tiên sẽ thất bại ("có ký tự chữ hoa và chữ thường!"), Không nên sao?
Howard

@Howard: Có nghĩa là cả chữ in hoa và chữ thường đều cần thiết trong mật khẩu. Thông báo thiếu từ "không".
Konrad Borowski

Không rõ ràng trong một số phông chữ rằng chữ l trong mật khẩu đầu tiên đó là hình elip chữ thường và không phải là số một, vì vậy tôi đang chỉnh sửa để thay thế nó bằng một chữ cái viết thường không rõ ràng.
Peter Taylor

@PeterTaylor À, cảm ơn bạn. Quả thực tôi đọc nó dưới dạng 1(chữ số một) thay vì ell.
Howard

Câu trả lời:


8

Perl, 203 194 189 193 ký tự

Đây là Perl của tôi về vấn đề này:

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."

Các regexes kiểm tra, theo thứ tự, mật khẩu:

  • bắt đầu bằng một chữ cái, có tám đến mười hai ký tự

  • chứa một chữ số

  • chứa một chữ cái viết hoa

  • có tám hoặc ít hơn chữ hoa

  • có tám hoặc ít hơn chữ cái viết thường

  • chứa một chữ cái viết thường

  • không chứa bất kỳ dấu chấm câu bị cấm, ba lần xuất hiện của bất kỳ ký tự nào, nhiều hơn một lần xuất hiện của một ký tự nhân đôi, tên người dùng hoặc tên người dùng bị đảo ngược.

(Cảm ơn Peter Taylor đã chỉ ra một lỗi trong phiên bản 189-char.)


Tìm hiểu làm thế nào để chạy cái này trên ideone use v5.10;và nó không thành công trong trường hợp thử nghiệm "là regexes thoát đúng" của tôi. Xem ideone.com/QKFnZ
Peter Taylor

@PeterTaylor: Tôi không biết về Ruby, nhưng trong bản sửa lỗi Perl sẽ là \Q$u\E|\Q$n(phần cuối cùng \Ecó thể được bỏ qua, nếu phần này sẽ được chuyển đến hết).
Konrad Borowski

OTOH Tôi nghĩ rằng một ký tự có thể được lưu bằng cách hợp nhất các lần lặp lại như (.)(.*\1.*\1|\1.*(.)\3)(không được kiểm tra - Tôi sẽ không thử kịch bản một pin thử nghiệm đầy đủ với ideone).
Peter Taylor

5

Ruby, 270 ký tự

$><<"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."

Một triển khai ruby ​​xây dựng trên mười hai biểu thức chính quy. Mỗi biểu thức là một kết hợp dương (năm đầu tiên) hoặc một kết quả phủ định (bảy sau). Như một hạn chế, tên người dùng chỉ có thể chứa các chữ cái hoặc chữ số.

Kết hợp biểu thức chính quy tích cực:

  • /^.{8,12}$/: có ít nhất 8 ký tự!, không dài hơn 12 ký tự!
  • /\p{Lower}//\p{Upper}/: có ký tự chữ hoa và chữ thường!
  • /^(\p{Alpha}.*){2}/: có ít nhất 2 chữ cái!, có một chữ cái đầu!
  • /\d/: có ít nhất 1 chữ số!

Kết hợp biểu thức chính quy phủ định:

  • /(\p{Lower}.*){9}/: không có nhiều hơn 8 chữ cái viết thường!
  • /(\p{Upper}.*){9}/: không có quá 8 chữ cái viết hoa!
  • /(.)\1.*(.)\2/: không có nhiều hơn 1 cặp ký tự lặp lại!
  • /(.).*\1.*\1/: không có 3 lần xuất hiện của cùng một nhân vật!
  • /[ ^=&#,;"<>\[|)]/: không chứa dấu mũ, dấu cách, =, &, #, ,,;, ",>, <, [, |,)
  • /#{u}/: không phải là tên người dùng của bạn!, không chứa tên người dùng của bạn!
  • /#{u.reverse}/: không phải là tên người dùng của bạn ngược!, không chứa tên người dùng của bạn ngược!

Điều này không thoát khỏi tên người dùng, vì vậy mật khẩu hoàn toàn hợp lệ có thể bị từ chối. Trường hợp thử nghiệm tại ideone.com/bPpeo
Peter Taylor

@PeterTaylor Đó là lý do tại sao tôi lưu ý hạn chế về tên người dùng trong câu trả lời của tôi.
Howard

1

Python 3, 291 byte / ký tự

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])])

Định dạng và nhận xét độc đáo hơn:

# 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.
                           ])

Bạn có thể tìm thấy giải pháp này trên ideone.com , nhưng đầu ra trông hơi xấu xí vì nó không hiển thị đầu vào được xác định trước hoặc thậm chí ngắt dòng ở đó. Ngoài ra, kết hợp tên người dùng - mật khẩu "JOE.smith"- "JOE!smith123"hiện được nhập dưới dạng dữ liệu đầu vào cố định.
Tôi đã thêm một sự cố của tất cả các kiểm tra như đầu ra gỡ lỗi mặc dù.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.