পোস্ট-ইটের মাধ্যমে সুরক্ষা


16

আপনি জানেন যে হ্যাকাররা সর্বত্র রয়েছে এবং তারা সমস্ত কিছু হ্যাক করতে চায়। আপনাকে পাসওয়ার্ডের প্রয়োজনীয়তা তৈরি করতে বলা হয়েছিল যা কোনও হ্যাকার বন্ধ করে দেবে । সমস্যাটি হ'ল, আপনার বস শুনেছেন যে LOC এর জন্য অর্থ প্রদান করা খারাপ এবং তিনি আপনাকে সহজে কাজ করতে পারে এমন সহজ জিনিস লিখতে প্রতি মাসে serted 1800 - $ 0.03 * অক্ষর প্রদান করে s সুতরাং, আপনাকে অল্প সংখ্যক অক্ষর ব্যবহার করতে হবে (আশা করি খুব ছোট), অথবা অন্যথায় নগদ সম্পর্কে ভুলে যেতে হবে। এছাড়াও, আপনি যে ভাষাটি ব্যবহার করবেন তা আপনার বসের যত্ন নেই।

ভাল পাসওয়ার্ডগুলির প্রয়োজনীয়তা উল্লিখিত নিবন্ধের মতোই, অভিধান ভিত্তিক প্রয়োজনীয়তাগুলি বহিরাগত ফাইলগুলির উপর নির্ভর করে সমাধান এড়াতে অপসারণ করা ছাড়া, আপনাকে অক্ষরগুলি পুনরায় সাজানোর জন্য পরীক্ষা করতে হবে না (এটি আসলে কী বোঝায় তা বোঝা শক্ত), শেষ নিয়ম সরানো হয়েছে (3/4 কি?) এবং এটি পুরানো পাসওয়ার্ড চেক করে না।

লিঙ্কযুক্ত নিবন্ধ থেকে নির্দিষ্ট প্রয়োজনীয়তা অপসারণ করার পরে সঠিক প্রয়োজনীয়তাগুলি হ'ল:

  • কমপক্ষে 8 টি চরিত্র রয়েছে!
  • আর 12 অক্ষরের চেয়ে বেশি হবে না!
  • উপরের এবং ছোট হাতের অক্ষর আছে!
  • 8 টির বেশি অক্ষরের অক্ষর নেই!
  • 8 টিরও বেশি ছোট-মামলার চিঠি (গুলি) নেই!
  • কমপক্ষে 2 টি বর্ণ (গুলি) আছে!
  • একটি নেতৃস্থানীয় চিঠি আছে!
  • কমপক্ষে 1 ডিজিট (গুলি) রয়েছে!
  • আপনার ব্যবহারকারীর নাম না!
  • পিছনে আপনার ব্যবহারকারীর নাম না!
  • আপনার ব্যবহারকারীর নাম নেই!
  • পিছনে আপনার ব্যবহারকারীর নাম ধারণ করে না!
  • পুনরাবৃত্তি করা অক্ষরের 1 টির বেশি জুড়ি নেই!
  • না 3 আছে occurences একই চরিত্রের!
  • না ক্যারেট (^)
  • স্থান নেই
  • not =
  • না conatain &
  • # নেই
  • নেই,
  • কনটেন না ;
  • নেই "
  • নেই>
  • নেই <
  • নেই [
  • ধারণ করে না |
  • নেই)

এই তালিকার সমস্ত ভুল বানান যেমন রয়েছে তেমন রেখে দেওয়া হয়েছিল।

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

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

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

সংক্ষিপ্ততম কোডটি টাকা জিততে পারে (জেপিজি ফাইল হিসাবে প্রেরণ করা হয়েছে)। এটিতে "ব্যবহারকারীর নাম:" এবং "পাসওয়ার্ড:" প্রম্পট প্রদর্শন করতে হবে এবং সঠিক বার্তার সাথে উত্তর দিতে হবে।


1
চমৎকার, একটি ডেইলি ডব্লিউটিএফ নিবন্ধে একটি কোড গল্ফ চ্যালেঞ্জ দেখে, +1 ;-)
ক্রিস্টোফিড

1
প্রথম উদাহরণটি ব্যর্থ হওয়া উচিত ("উচ্চ এবং নিম্নতর অক্ষর থাকতে হবে!"), তাই না?
হাওয়ার্ড

@ হাওয়ার্ড: এর অর্থ হ'ল পাসওয়ার্ডে বড় হাতের এবং ছোট উভয় অক্ষরের প্রয়োজন "না" শব্দের অভাব লক্ষ্য করুন।
কনরাড বোরোস্কি

কিছু ফন্টে এটি খুব স্পষ্ট নয় যে প্রথম পাসওয়ার্ডের এল একটি ছোট-বড় একটি এল এবং এক নম্বর নয়, তাই আমি এটিকে একটি স্পষ্ট লোয়ার-কেস অক্ষর দিয়ে প্রতিস্থাপন করতে সম্পাদনা করছি।
পিটার টেলর

@ পিটারটেলর আহ, আপনাকে ধন্যবাদ প্রকৃতপক্ষে আমি এটি 1এল এর পরিবর্তে (প্রথম এক) হিসাবে পড়ি ।
হাওয়ার্ড

উত্তর:


8

পার্ল, 203 194 189 193 অক্ষর

এখানে আমার পার্লটি সমস্যাটি দেখবে:

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

রেজিক্সগুলি পরীক্ষা করে যাতে পাসওয়ার্ডটি থাকে:

  • একটি অক্ষর দিয়ে শুরু হয়, আট থেকে বারো অক্ষর রয়েছে

  • একটি সংখ্যা রয়েছে

  • একটি বড় হাতের অক্ষর রয়েছে

  • আট বা তার চেয়ে কম বড় অক্ষর রয়েছে has

  • আট বা তার চেয়ে কম ছোট অক্ষর রয়েছে

  • একটি ছোট হাতের অক্ষর রয়েছে

  • নিষিদ্ধ বিরাম চিহ্নগুলির কোনও, কোনও অক্ষরের তিনটি উপস্থিতি, দ্বিগুণ চরিত্রের একাধিক ঘটনা, ব্যবহারকারীর নাম বা ব্যবহারকারীর নাম বিপরীত থাকে।

(189-চর সংস্করণে বাগটি নির্দেশ করার জন্য পিটার টেলরকে ধন্যবাদ))


কীভাবে আইডিয়োনে use v5.10;এটি চালানো যায় তা নির্ধারণ করে এবং এটি পরীক্ষার ক্ষেত্রে আমার "রেজেক্সগুলি সঠিকভাবে পালিয়ে যায়" ব্যর্থ হয়। আইডোন.কম
পিটার টেলর

@ পিটারটেলর: আমি রুবির সম্পর্কে জানি না, তবে পার্ল ফিক্সে হবে \Q$u\E|\Q$n(শেষটি \Eএড়িয়ে যেতে পারে, যদি এই অংশটি শেষ হয়ে যায়)।
কনরাড বোরোস্কি

OTOH আমি মনে করি পুনরাবৃত্তিগুলি মার্জ করে একটি চরিত্র সংরক্ষণ করা যেতে পারে (.)(.*\1.*\1|\1.*(.)\3)(পরীক্ষিত নয় - আমি আদর্শের সাথে একটি সম্পূর্ণ পরীক্ষার ব্যাটারি স্ক্রিপ্ট করার চেষ্টা করতে যাচ্ছি না)।
পিটার টেলর

5

রুবি, 270 টি অক্ষর

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

একটি রুবি বাস্তবায়ন বারোটি নিয়মিত অভিব্যক্তি তৈরি করে। প্রতিটি অভিব্যক্তি হয় ইতিবাচক মিল (প্রথম পাঁচ) বা একটি negativeণাত্মক (পরে সাত)। বিধিনিষেধ হিসাবে ব্যবহারকারীর নামটিতে কেবল অক্ষর বা সংখ্যা থাকতে পারে।

ইতিবাচক নিয়মিত অভিব্যক্তি মেলে:

  • /^.{8,12}$/: কমপক্ষে 8 টি অক্ষর (গুলি) আছে! 12 টির চেয়ে বেশি দীর্ঘতর হবে না!
  • /\p{Lower}/এবং /\p{Upper}/: উপরের এবং ছোট হাতের অক্ষর রয়েছে!
  • /^(\p{Alpha}.*){2}/: কমপক্ষে 2 টি অক্ষর (গুলি) আছে! একটি নেতৃস্থানীয় চিঠি আছে!
  • /\d/: কমপক্ষে 1 ডিজিট (গুলি) করুন!

নেতিবাচক নিয়মিত অভিব্যক্তি মেলে:

  • /(\p{Lower}.*){9}/: 8 টিরও বেশি ছোট অক্ষরের অক্ষর নেই!
  • /(\p{Upper}.*){9}/: 8 টিরও বেশি অক্ষরের অক্ষর নেই!
  • /(.)\1.*(.)\2/: পুনরাবৃত্তি করা অক্ষরের 1 টির বেশি জুড়ি নেই!
  • /(.).*\1.*\1/: একই চরিত্রের 3 টি উপস্থিতি নেই!
  • /[ ^=&#,;"<>\[|)]/: ক্যারেট, স্পেস, =, &, #, ,,; ",>, <, [, |,) নেই
  • /#{u}/: আপনার ব্যবহারকারীর নাম না! আপনার ব্যবহারকারীর নামটি না!
  • /#{u.reverse}/: আপনার ব্যবহারকারী নাম পিছন দিকে না! আপনার ব্যবহারকারীর নামটি পিছনে রাখবেন না!

এটি ব্যবহারকারীর নামটি এড়ায় না, সুতরাং একটি পুরোপুরি বৈধ পাসওয়ার্ড বাতিল হতে পারে। আইডোন.কম
পিটার টেলর

@ পিটারটেলর সেজন্য আমি আমার উত্তরে ব্যবহারকারীর নামের জন্য বিধিনিষেধটি উল্লেখ করেছি।
হাওয়ার্ড

1

পাইথন 3, 291 বাইট / অক্ষর

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

আরও সুন্দর বিন্যাসিত এবং মন্তব্য:

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

আপনি এই আদর্শটি আইডোন.কম এ খুঁজে পেতে পারেন তবে আউটপুটটি কিছুটা কুরুচিপূর্ণ দেখাচ্ছে কারণ এটি সেখানে পূর্বনির্ধারিত ইনপুট বা লাইন ব্রেকগুলি প্রদর্শন করে না। এছাড়াও, ব্যবহারকারীর নাম-পাসওয়ার্ড সংমিশ্রণ "JOE.smith"- "JOE!smith123"বর্তমানে স্থির ইনপুট ডেটা হিসাবে প্রবেশ করা হয়েছে।
আমি যদিও ডিবাগ আউটপুট হিসাবে সমস্ত চেকের একটি ব্রেকডাউন যুক্ত করেছি।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.