Με αφορμή κάποιες πρόσφατες συζητήσεις με τη παρέα μου περί ασφαλών κωδικών, μπήκα στη διαδικασία να κάνω ένα προγραμματάκι που κάνει τους υπολογισμούς μιας
Brute Force Attack.
Είναι μια βιαστική δουλειά (χωρίς να θέλω να δικαιολογηθώ για τυχόν λάθη
) λόγω εξεταστικής και ελάχιστου χρόνου.
Αυτό που ουσιαστικά κάνει, είναι να δέχεται σαν είσοδο μια πληκτρολόγηση του εκάστοτε χρήστη (αυστηρά μεγαλύτερη από 2 χαρακτήρες), να υπολογίζει τους μέγιστους δυνατούς συνδυασμούς και να τυπώνει το χρόνο που χρειάζετε ένα σύγχρονο desktop pc να σπάσει τον κωδικό.
Οποιεσδήποτε αλλαγές, ενημερώσεις και διορθώσεις είναι ελεύθερες και καλοδεχούμενες από τον καθένα.
ΥΓ: Έχω την εντύπωση πως οι συναρτήσεις (πράξεις) είναι σωστές αλλά δε βάζω και το χέρι μου στη φωτιά
!
# Importing libraries
import re
import locale
# Commify values
def number_format(num, places=0):
locale.setlocale(locale.LC_NUMERIC, "")
return locale.format("%.*f", (places, num), True)
# Initialize values
posChars, comb, seconds, minutes = 0, 0, 0, 0
hours, days, years, prefix, suffix = 0, 0, 0, 0, 'seconds'
lows = re.compile('[a-z]')
highs = re.compile('[A-Z]')
nums = re.compile('[0-9]')
wilds = re.compile('[!,@,#,$,%,^,&,*,?,_,~,-,(,),[,]]')
# Ask user for input password (min length 3)
while True:
word = raw_input('Check how secure is your password: ')
if(len(word) > 2):
break
print 'Your password is way too weak, only ' + str(len(word)) + ' characters long!'
# Keep track of characters used
if(lows.findall(word)):
posChars += 26
if(highs.findall(word)):
posChars += 26
if(nums.findall(word)):
posChars += 10
if(wilds.findall(word)):
posChars += 13
# Print statistics
comb = posChars**len(word)
print 'Your password is ' + str(len(word)) + ' characters long and has ' + str(number_format(comb)) + ' combinations.'
seconds = comb/2400000000.0 # Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40 GHz
if(seconds <= 1):
prefix = seconds
print 'It would take {0} {1} for a desktop pc to crack your password.'.format(number_format(prefix, 7).rstrip('0'), suffix)
else:
seconds = int(round(seconds, 0))
if(seconds > 60):
minutes = seconds / 60
seconds = seconds % 60
prefix = minutes
suffix = 'minutes'
if(minutes > 60):
hours = minutes / 60
minutes = minutes % 60
prefix = hours
suffix = 'hours'
if(hours > 24):
days = hours / 24
hours = hours % 24
prefix = days
suffix = 'days'
if(days > 365):
years = days / 365
days = days % 365
prefix = years
suffix = 'years'
print 'It would take about {0} {1} for a desktop pc to crack your password.'.format(number_format(prefix), suffix)