পাসওয়ার্ড শক্তি যাচাই করার জন্য রেজেক্স


142

আমার পাসওয়ার্ড শক্তি মানদণ্ড নীচে হিসাবে:

  • 8 টি অক্ষরের দৈর্ঘ্য
  • উচ্চতর ক্ষেত্রে 2 টি চিঠি
  • 1 বিশেষ চরিত্র (!@#$&*)
  • 2 টি সংখ্যা (0-9)
  • লোয়ার কেসে তিনটি চিঠি

কেউ দয়া করে তার জন্য আমাকে রেইগেক্স দিতে পারেন। সমস্ত শর্তাবলী পাসওয়ার্ড দ্বারা পূরণ করা আবশ্যক।


2
আপনি কি সত্যিই ইন্টারনেটে আপনার পাসওয়ার্ড সুরক্ষা ব্যবস্থা বিশ্বাস করতে ইচ্ছুক?
বোরিলিড

12
@ বোরিলিড: আপনার পাসওয়ার্ড নীতিগুলি প্রকাশ করা সাধারণত আপনার সুরক্ষার উপর উল্লেখযোগ্যভাবে প্রভাব ফেলবে না । যদি এটি হয় তবে আপনার নীতিগুলি খারাপ ("কেবল passwordএবং hello123বৈধ পাসওয়ার্ডগুলি!")।
জোছিম সউর

3
@ জোয়াচিম সাউর: আমি এটাই বোঝাতে চাইনি। আমি যা বোঝাতে চেয়েছিলাম তা হল পোস্টারটি সম্ভবত যা কিছু রেগেক্স গ্রহণ করবে তা বিশ্বাস করতে চলেছে। এমন ভাল ধারণা না।
বোরিলিড

3
আসলে এই রেজেক্স সার্ভিস কোড হতে চলেছে, আমি অন্ধভাবে এটি বিশ্বাস না করে বিভিন্ন ক্ষেত্রে পরীক্ষা করব :)
অজয় কেলকার

9
জটিল পাসওয়ার্ডের নিয়মগুলি সাধারণত আরও সুরক্ষিত পাসওয়ার্ডগুলিতে নেতৃত্ব দেয় না, কেবলমাত্র সর্বনিম্ন দৈর্ঘ্য। লোকেরা প্রচুর শক্তিশালী পাসওয়ার্ড মনে রাখতে পারে না এবং এই জাতীয় নিয়মগুলি ভাল পাসওয়ার্ডের স্কিমগুলিতে হস্তক্ষেপ করতে পারে। লোকেরা এই জাতীয় নিয়মকে বাইপাস করতে খুব উদ্ভাবক হতে পারে, যেমন "পাসওয়ার্ড -২০১৪" এর মতো দুর্বল পাসওয়ার্ড ব্যবহার করে। প্রায়শই আপনি শক্তিশালীগুলির পরিবর্তে দুর্বল পাসওয়ার্ডগুলি দিয়ে শেষ করেন।
মার্টিনস্টোকেলি

উত্তর:


427

আপনি ইতিমধ্যে ইতিবাচক চেহারা ব্যবহার করে এই চেকগুলি করতে পারেন:

^(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$

রুবারার লিঙ্ক

ব্যাখ্যা:

^                         Start anchor
(?=.*[A-Z].*[A-Z])        Ensure string has two uppercase letters.
(?=.*[!@#$&*])            Ensure string has one special case letter.
(?=.*[0-9].*[0-9])        Ensure string has two digits.
(?=.*[a-z].*[a-z].*[a-z]) Ensure string has three lowercase letters.
.{8}                      Ensure string is of length 8.
$                         End anchor.

92
এমন যে কেউ অন্তত একটি দৈর্ঘ্য চায় n, প্রতিস্থাপন .{8}সঙ্গে.{n,}
NullUserException

14
সম্পূর্ণ ব্যাখ্যার জন্য +1। আমার পাসওয়ার্ডের বিধিগুলি ভিন্ন তবে আপনার উত্তরের উপর ভিত্তি করে আমি রেজেক্সটি মানিয়ে নিতে পারি।
মরভেল

14
রেজেক্সে কি ঘটছে তা বর্ণনা করার জন্য আপনাকে ধন্যবাদ। এটি আমাদের মধ্যে যারা সিনট্যাক্সের সাথে সত্যিকার অর্থে কখনও আসে নি তাদের পক্ষে দুর্দান্ত শেখার উদাহরণ হিসাবে কাজ করে।

4
আমি রেজেক্সের ব্যাখ্যাটিরও প্রশংসা করি। কী চলছে তা বুঝতে না পেরে অনেক সময় আমি খুঁজে পেয়েছি এমন জটিল রেজেক্স ব্যবহার করি।
নিকোলাস স্মিথ

4
দুর্দান্ত প্যাটার্ন, আমি ভাবছি কেন কোয়ান্টিফায়ার ব্যবহার করছেন না? কমপক্ষে 1 টি বিশেষ, 1 নম্বর, 1 বিশেষ চর, 8 টি অক্ষর: ^ (??। * ([এজেড]) {1,}) (? =। * [! @ # $ & *] {1,}) ( ? =। * [0-9] {1,}) (? =। * [আজ] {1,}) {8,100} $
রকঅনগম

11

আপনার প্রতিটি প্রতিবন্ধকতা আলাদাভাবে নির্দিষ্ট করতে আপনি শূন্য-দৈর্ঘ্যের ইতিবাচক চেহারা-এগিয়ে ব্যবহার করতে পারেন:

(?=.{8,})(?=.*\p{Lu}.*\p{Lu})(?=.*[!@#$&*])(?=.*[0-9])(?=.*\p{Ll}.*\p{Ll})

যদি আপনার রেজেক্স ইঞ্জিন স্বীকৃতিটিকে সমর্থন করে না \pএবং খাঁটি ASCII যথেষ্ট হয়, তবে আপনি তার \p{Lu}সাথে [A-Z]এবং এর \p{Ll}সাথে প্রতিস্থাপন করতে পারেন [a-z]


8

উপরে দেওয়া উত্তরগুলি নিখুঁত তবে আমি একটি বৃহত্তর পরিবর্তে একাধিক ছোট রেজেক্স ব্যবহার করার পরামর্শ দিচ্ছি
লম্বা রেইগেক্সকে বিভক্ত করার কিছু সুবিধা রয়েছে:

  • লিখতে এবং পড়তে স্বাচ্ছন্দ্য
  • ডিবাগ করার জন্য স্বাচ্ছন্দ্য
  • রেজেক্সের অংশ যুক্ত / সরানোর সহজতা

সাধারণত এই পদ্ধতির কোড সহজেই বজায় রাখা যায়

এটি বলার পরে, আমি সুইডে উদাহরণ হিসাবে উদাহরণস্বরূপ একটি কোডের অংশটি ভাগ করি :

struct RegExp {

    /**
     Check password complexity

     - parameter password:         password to test
     - parameter length:           password min length
     - parameter patternsToEscape: patterns that password must not contains
     - parameter caseSensitivty:   specify if password must conforms case sensitivity or not
     - parameter numericDigits:    specify if password must conforms contains numeric digits or not

     - returns: boolean that describes if password is valid or not
     */
    static func checkPasswordComplexity(password password: String, length: Int, patternsToEscape: [String], caseSensitivty: Bool, numericDigits: Bool) -> Bool {
        if (password.length < length) {
            return false
        }
        if caseSensitivty {
            let hasUpperCase = RegExp.matchesForRegexInText("[A-Z]", text: password).count > 0
            if !hasUpperCase {
                return false
            }
            let hasLowerCase = RegExp.matchesForRegexInText("[a-z]", text: password).count > 0
            if !hasLowerCase {
                return false
            }
        }
        if numericDigits {
            let hasNumbers = RegExp.matchesForRegexInText("\\d", text: password).count > 0
            if !hasNumbers {
                return false
            }
        }
        if patternsToEscape.count > 0 {
            let passwordLowerCase = password.lowercaseString
            for pattern in patternsToEscape {
                let hasMatchesWithPattern = RegExp.matchesForRegexInText(pattern, text: passwordLowerCase).count > 0
                if hasMatchesWithPattern {
                    return false
                }
            }
        }
        return true
    }

    static func matchesForRegexInText(regex: String, text: String) -> [String] {
        do {
            let regex = try NSRegularExpression(pattern: regex, options: [])
            let nsString = text as NSString
            let results = regex.matchesInString(text,
                options: [], range: NSMakeRange(0, nsString.length))
            return results.map { nsString.substringWithRange($0.range)}
        } catch let error as NSError {
            print("invalid regex: \(error.localizedDescription)")
            return []
        }
    }
}

এছাড়াও, উপরের মতো জটিল রেজেেক্স ব্যবহার করার সময়, নিজেকে বিপর্যয়কর ব্যাকট্র্যাকিংয়ের জন্য খোলার পক্ষে খুব সহজ ( নিয়মিত- এক্সপ্রেশন.ইন.ফো / ক্যাটাস্ট্রোফিক এইচটিএমএল )। আপনার সার্ভারটি 100% সিপিইউতে স্থগিত হওয়া অবধি একদিন অবহেলা করা যাবে না কারণ কোনও ব্যবহারকারী "অদ্ভুত" পাসওয়ার্ড ব্যবহার করেছেন। উদাহরণ: ^ ([a-z0-9] +) {8,} $ (আপনি ত্রুটিটি দেখতে পাচ্ছেন?)
akzenT


1

কোডাডিক্টসের সমাধানটি সূক্ষ্মভাবে কাজ করে, তবে এটি একটি আরও কার্যকর: (পাইথন সিনট্যাক্স)

password = re.compile(r"""(?#!py password Rev:20160831_2100)
    # Validate password: 2 upper, 1 special, 2 digit, 1 lower, 8 chars.
    ^                        # Anchor to start of string.
    (?=(?:[^A-Z]*[A-Z]){2})  # At least two uppercase.
    (?=[^!@#$&*]*[!@#$&*])   # At least one "special".
    (?=(?:[^0-9]*[0-9]){2})  # At least two digit.
    .{8,}                    # Password length is 8 or more.
    $                        # Anchor to end of string.
    """, re.VERBOSE)

অবহেলিত চরিত্রের ক্লাসগুলি একক ধাপে কাঙ্ক্ষিত চরিত্র পর্যন্ত সমস্ত কিছুই গ্রাস করে, শূন্য ব্যাকট্র্যাকিংয়ের প্রয়োজন। (ডট স্টার সলিউশনটি ঠিক কাজ করে তবে কিছু ব্যাকট্র্যাকিংয়ের প্রয়োজন হয়)) পাসওয়ার্ডের মতো স্বল্প লক্ষ্যযুক্ত স্ট্রিংগুলির সাথে অবশ্যই এই দক্ষতার উন্নতি নগন্য হবে।


আপনি দয়া করে পরীক্ষা করতে পারেন এটি সঠিক কিনা? ট্রিপল ডাবলকোট এবং প্রশ্ন চিহ্নের মধ্যে প্রথম লাইনে গোলাকার বন্ধনী খোলার কারণে আমি সন্দেহের মধ্যে আছি। আমি দেখতে পাই পাইথন মন্তব্য (হ্যাশ) পরে আছে। আমি শেষ অ্যাঙ্কারের (ডলার সাইন) কাছাকাছি সংবাদদাতা বন্ধ রাউন্ড বন্ধনী দেখতে পাচ্ছি না। উল্লেখ করা উচিত আমি কোনও রেজেক্স প্রভি নয়।
lospejos

@ লস্পিজোস - # টি নিয়মিত এক লাইনের মন্তব্যের শুরু নয়। এই হ্যাশ একটি মন্তব্য গোষ্ঠীর অংশ যা একটি দিয়ে শুরু হয় (?#এবং একটি দিয়ে শেষ হয় )। এই রেজেক্সে কোনও ভারসাম্যহীন পেরেন নেই।
রাজারগনার

1
import re

RegexLength=re.compile(r'^\S{8,}$')
RegexDigit=re.compile(r'\d')
RegexLower=re.compile(r'[a-z]')
RegexUpper=re.compile(r'[A-Z]')


def IsStrongPW(password):
    if RegexLength.search(password) == None or RegexDigit.search(password) == None or RegexUpper.search(password) == None or RegexLower.search(password) == None:
        return False
    else:
        return True

while True:
    userpw=input("please input your passord to check: \n")
    if userpw == "exit":
        break
    else:
        print(IsStrongPW(userpw))

1

@ কোডাডিক্ট এর সমাধান কাজ করবে।

আপনার কিছু বিধি পরিবর্তন করার বিষয়টিও বিবেচনা করা উচিত:

  1. আরও বিশেষ অক্ষর যুক্ত করুন যেমন%, ^, (,), -, _, +, এবং পিরিয়ড। আমি ইউএস কীবোর্ডের সংখ্যার চিহ্নগুলির চেয়ে বেশি যে বিশেষ অক্ষরটি মিস করেছি সেগুলি আমি যুক্ত করছি। রেজেক্সের ব্যবহারগুলি এড়িয়ে চলুন।
  2. পাসওয়ার্ডটি 8 বা তার বেশি অক্ষর তৈরি করুন। আটটি স্থিতিশীল নয়।

উপরের উন্নতিগুলি সহ, এবং আরও নমনীয়তা এবং পঠনযোগ্যতার জন্য, আমি এতে রেজিটাকে সংশোধন করব।

^(?=.*[a-z]){3,}(?=.*[A-Z]){2,}(?=.*[0-9]){2,}(?=.*[!@#$%^&*()--__+.]){1,}.{8,}$

বেসিক ব্যাখ্যা

(?=.*RULE){MIN_OCCURANCES,}     Each rule block is shown by (){}. The rule and number of occurrences can then be easily specified and tested separately, before getting combined

বিস্তারিত ব্যাখ্যা

^                             start anchor
(?=.*[a-z]){3,}               lowercase letters. {3,} indicates that you want 3 of this group
(?=.*[A-Z]){2,}               uppercase letters. {2,} indicates that you want 2 of this group
(?=.*[0-9]){2,}               numbers. {2,} indicates that you want 2 of this group
(?=.*[!@#$%^&*()--__+.]){1,}   all the special characters in the [] fields. The ones used by regex are escaped by using the \ or the character itself. {1,} is redundant, but good practice, in case you change that to more than 1 in the future. Also keeps all the groups consistent
{8,}                          indicates that you want 8 or more
$                             end anchor

এবং সবশেষে, পরীক্ষার উদ্দেশ্যে এখানে উপরোক্ত রেগেক্সের সাথে একটি রবুলিংক রয়েছে


ধন্যবাদ @ আফ্রিকা আমি আমার কোড এ ব্যবহার করছি। আমি পঠনযোগ্যতা এবং পুনরাবৃত্তি-যোগ্যতা পছন্দ করি, কারণ কখন আপনাকে ভবিষ্যতে ফিরে যেতে হবে এবং অর্থাত্ পাসওয়ার্ড নীতি পরিবর্তনের ক্ষেত্রে :)
lsu_guy

0

পিএইচপি-র জন্য, এটি দুর্দান্ত কাজ করে!

 if(preg_match("/^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^0-9]*[0-9]){2}).{8,}$/", 
 'CaSu4Li8')){
    return true;
 }else{
    return fasle;
 }

এই ক্ষেত্রে ফলাফল সত্য

টুইটার


কেন না return preg_match("/^(?=(?:[^A-Z]*[A-Z]){2})(?=(?:[^0-9]*[0-9]){2}).{8,}$/", 'CaSu4Li8')?
এলোআইএসডিজি

0

আরেকটি সমাধান:

import re

passwordRegex = re.compile(r'''(
    ^(?=.*[A-Z].*[A-Z])                # at least two capital letters
    (?=.*[!@#$&*])                     # at least one of these special c-er
    (?=.*[0-9].*[0-9])                 # at least two numeric digits
    (?=.*[a-z].*[a-z].*[a-z])          # at least three lower case letters
    .{8,}                              # at least 8 total digits
    $
    )''', re.VERBOSE)

def userInputPasswordCheck():
    print('Enter a potential password:')
    while True:
        m = input()
        mo = passwordRegex.search(m) 
        if (not mo):
           print('''
Your password should have at least one special charachter,
two digits, two uppercase and three lowercase charachter. Length: 8+ ch-ers.

Enter another password:''')          
        else:
           print('Password is strong')
           return
userInputPasswordCheck()

0

নিম্নলিখিত 4 টি জটিলতার নিয়মের মধ্যে পাসওয়ার্ড কমপক্ষে 3 টি পূরণ করতে হবে,

[কমপক্ষে 1 বড় হাতের অক্ষর (এজেড) কমপক্ষে 1 ছোট হাতের অক্ষর (এজেড) কমপক্ষে 1 ডিজিট (0-9) কমপক্ষে 1 টি বিশেষ অক্ষর - স্থানটিকেও বিশেষ অক্ষর হিসাবে বিবেচনা করতে ভুলবেন না]

কমপক্ষে 10 টি অক্ষর

সর্বাধিক 128 টি অক্ষর

এক সারিতে 2 টির বেশি অভিন্ন অক্ষর নয় (যেমন 111 অনুমোদিত নয়)

'^ (?! ((।) \ 1 {2}) ((? =। [অ্যাজ]) (? =। [এজেড]) (? =। [0-9]) | (? =। [আজ]] ) (=। [জেড]) (=। [^ zA-Z0-9]) |। (= ?। [জেড]) (= ?। [0-9]) (= [^ একটি -zA-Z0-9]) | (???। [আজ]] (? =। [0-9]) (? =। * [^ a-zA-Z0-9])) {10,127} $ '

(?!। * (।) \ 1 {2})

(? =। [এজেড]) (? =। এজেড]) (? =। [এজেড]) (? =। * [0-9])

(? =। [এজেড]) (? =। এজেড]) (? =। [এজেড]) (? =। * [^ এ-জেডএ-জেড0-9])

(? =। [এজেড]) (? =। [0-9]) (? =। * [^ A-zA-Z0-9])

(? =। [এজেড]) (? =। [0-9]) (? =। * [^ a-zA-Z0-9])

। {10,127}


0

দুর্ভাগ্যক্রমে উপরের সবগুলিই আমার পক্ষে কাজ করে নি। একটি শক্তিশালী পাসওয়ার্ডের বেসিক বিধিগুলি

  • কমপক্ষে একটি বড় অক্ষর থাকা উচিত
  • কমপক্ষে একটি ছোট অক্ষর থাকা উচিত
  • কমপক্ষে একটি সংখ্যা থাকা উচিত
  • কমপক্ষে একটি বিশেষ চরিত্র থাকা উচিত
  • এবং সর্বনিম্ন দৈর্ঘ্য

সুতরাং, সেরা রেজেক্স হবে

^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*]).{8,}$

উপরের রেজেক্সের সর্বনিম্ন দৈর্ঘ্য 8 রয়েছে। আপনি এটিকে 8 ডলার ,} থেকে {যে কোনও সংখ্যা ,} এ পরিবর্তন করতে পারেন

বিধি পরিবর্তন?

বলুন যে আপনি ন্যূনতম x অক্ষর ছোট অক্ষর, y অক্ষর মূলধন অক্ষর, z অক্ষর সংখ্যা, সর্বনিম্ন দৈর্ঘ্য ডাব্লু চান । তারপরে রেজেক্সের নীচে চেষ্টা করুন

^(?=.*[a-z]{x,})(?=.*[A-Z]{y,})(?=.*[0-9]{z,})(?=.*[!@#\$%\^&\*]).{w,}$

নোট: পরিবর্তন এক্স , Y , z- র , W Regex মধ্যে

সম্পাদনা করুন: রেগেক্স উত্তর আপডেট হয়েছে

সম্পাদনা 2: সংশোধন করা হয়েছে


আপনার রেজেক্সটি মিলছে 12345678আপনি কি নিশ্চিত যে এটি একটি শক্তিশালী পাসওয়ার্ড? দয়া করে, পোস্ট করার আগে আপনার রেজেক্স চেষ্টা করুন।
টোটো

এটি আরও ভাল তবে প্রশ্নের উত্তর দেয় না, তারা 1) 8 টি অক্ষরের দৈর্ঘ্য চায়। 2) আপার ক্ষেত্রে 2 টি চিঠি। 3) 1 টি বিশেষ অক্ষর (! @ # $ & *)। 4) 2 টি সংখ্যা (0-9)। 5) লোয়ার কেসে 3 টি চিঠি।
পুরো

@ টোটো আপনি কি এখন আপনার চিন্তাভাবনা ভাগ করে নিতে পারেন?
জুনেদ খাতরী

আপনার রেজেক্সটি আমলে নিবে না যে 2 বাধ্যতামূলক বড় হাতের অক্ষরগুলি অন্য অক্ষরগুলির সাথে আলাদা করা যেতে পারে, ছোট হাতের অক্ষর এবং অঙ্কগুলির জন্য একই মন্তব্য। বৈধ উত্তরটি হ'ল এটি গ্রহণ করা হয়েছে।
টোটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.