Здравствуйте, Хабражители!
А как Вы храните свои пароли? Или у Вас один пароль на все случаи жизни? Раньше у меня было именно так! Ну то есть почти так. У меня их было два — идентификационный код и хитро мудрая анаграмма, составленная из моего мобильного телефона.
Если Вы один из таких как я, то прошу под кат.
У меня уже давно созревала идея написать что-нибудь подобное. И вот, наконец-то, у меня выдался свободный день и я решил реализовать это дело.
Итак, что бы мы хотели видеть:
Я представляю себе так:
После ввода пароля и url, мы получаем их md5-суммы, выполняем конкатенацию строк и получаем строку длинной 64 символа. Далее получаем md5-сумму этой строки и берем первые 10 символов — это и будет наш пароль. Довольно таки просто.
Мне очень нравиться Python и JavaScript, но так, как мы хотим получить консольное приложение, а как запустить в консоли программу на JavaScripte я не знаю, то будем писать на Pythone. Начнем:
Запустить это довольно просто — сохраняем все это дело в файл passkeep.py и запускаем:
Вот этой вещью я пользуюсь уже почти 12 часов. Зарегистрировался на 5 ресурсах и на 2 поменял пароль. Изначально, пароли генировал на 64 разрядном процессоре, теперь попробовал на 86 разрядном, вроде бы пароли совпадают. Ну это я так, на всякий случай.
Ах, да. Я еще это дело залил на Github: клац.
Хочу еще немного по-тестировать все это дело и, если проблем не будет, портировать на iOS/Android/Chrome Extensions.
Буду очень рад конструктивным замечаниям по реализации.
Спасибо за внимание.
UPD:
Спасибо хабраюзеру Dark_MX за его дополнения и спасибо Romansl за то, что нашел расширение для хрома.
А как Вы храните свои пароли? Или у Вас один пароль на все случаи жизни? Раньше у меня было именно так! Ну то есть почти так. У меня их было два — идентификационный код и хитро мудрая анаграмма, составленная из моего мобильного телефона.
Если Вы один из таких как я, то прошу под кат.
У меня уже давно созревала идея написать что-нибудь подобное. И вот, наконец-то, у меня выдался свободный день и я решил реализовать это дело.
План действий
Итак, что бы мы хотели видеть:
- Программа должна сама генерировать пароль на основе url ресурса, на котором мы регистрируемся например;
- Пароль должен быть достаточно стойким к брутафорсу, то есть содержать буквы и цифры;
- Пароль не должен храниться где-либо, а генерироваться на лету;
- Пароль должен быть восстановимым.
Я представляю себе так:
- После запуска программы, требуется ввести пароль(он может быть простым, допустим 45678);
- Требуется ввести url, например www.twitter.com ;
- Получаем 10-значный пароль, который и используем для регистрации.
Как это работает?
После ввода пароля и url, мы получаем их md5-суммы, выполняем конкатенацию строк и получаем строку длинной 64 символа. Далее получаем md5-сумму этой строки и берем первые 10 символов — это и будет наш пароль. Довольно таки просто.
Реализация
Мне очень нравиться Python и JavaScript, но так, как мы хотим получить консольное приложение, а как запустить в консоли программу на JavaScripte я не знаю, то будем писать на Pythone. Начнем:
import hashlib, sys, re
class PassKeep: #Да, это ООП, детка!
__password = ""
__length = 10 #Длина генерируемого пароля будет 10 символов.
url = ""
def getMd5(self, string): #Функция для получения md5 из строки.
string = str(string)
md5 = hashlib.md5()
md5.update(string)
return md5.hexdigest()
def __init__(self): #Ага, даже конструктор есть. На всякий пожарный. Вдруг я поставлю пароль по умолчанию.
self.__password = self.getMd5(self.__password)
self.time = self.getMd5(time.time())
def setUrl(self, url): #Задаем url.
self.url = self.getMd5(url)
return self.url
def setPasswd(self, passwd): #И пароль.
self.__password = self.getMd5(passwd)
return self.__password
def decrypt(self): #Главная функция, она все декрупирует.
password = self.__password #Получаем пароль и url,
url = self.url #что бы удобнее было работать.
result = self.getMd5(password + url) #И получаем md5 от результата конкатенации строк.
passwd_candidate = result[:self.__length] #От результата откусываем нужные нам 10 символов.
#А вот теперь начинаются извращения! После некоторого использования,
#я понял, что есть вероятность того, что первые n(10) символов могут быть цифрами.
#А пароль из одних цифр - это плохой пароль, поэтому надо проверять и что-то с этим делать!
if (len(re.findall(r'([0-9]+)', passwd_candidate)[0]) + 3 < len(passwd_candidate)): #Не менее трёх букв
return passwd_candidate
else: #А если менее, то будем исправлять.
result = ""
count = 0
sum = 1
for symbol in passwd_candidate: #Получаем по одному символы и проверяем.
if (sum < 4): #Если мы уже замени три цифры на буквы, то остальное просто добавляем.
try: #Если символ не приводиться к int, то он str (кэп).
int_symbol = int(symbol)
if (count%2 != 0): #Будем преобразовывать только нечётные по счету цифры.
print int_symbol
result += chr(122 - int_symbol) #Заменим цифру на букву, которая находиться под тем же порядковым номером с конца алфавита, что б никто не догадался!
sum += 1
count += 1
else: #Если четная, то пусть не меняется.
result += symbol
count += 1
except: #Если он str то мы его просто добавляем к результату.
result += symbol
count += 1
else:
result += symbol
count += 1
return result
p = PassKeep() #Создаем объект.
passwd = raw_input("Enter passwd \n") #У нас же консольное приложение как ни как!
p.setPasswd(passwd)
url = raw_input("Enter url, like www.example.com \n")
p.setUrl(url)
print p.decrypt() #Выводим все это безобразие на экран
sys.exit(0) #и выходим.
Запуск
Запустить это довольно просто — сохраняем все это дело в файл passkeep.py и запускаем:
python passkeep.py
Заключение
Вот этой вещью я пользуюсь уже почти 12 часов. Зарегистрировался на 5 ресурсах и на 2 поменял пароль. Изначально, пароли генировал на 64 разрядном процессоре, теперь попробовал на 86 разрядном, вроде бы пароли совпадают. Ну это я так, на всякий случай.
Ах, да. Я еще это дело залил на Github: клац.
Хочу еще немного по-тестировать все это дело и, если проблем не будет, портировать на iOS/Android/Chrome Extensions.
Буду очень рад конструктивным замечаниям по реализации.
Спасибо за внимание.
UPD:
Спасибо хабраюзеру Dark_MX за его дополнения и спасибо Romansl за то, что нашел расширение для хрома.