Для тех, кому лениво читать дальше, сразу скажу ответ: атака «логин равен паролю». По статистике, логин равный паролю встречается чаще, чем самый распространенный пароль из словаря. Далее в статье будут некоторые статистические исследования на эту тему, и история, с которой всё началось.

Поэтому в сегодняшнем исследовании я решил проверить, насколько часто встречаются пароли, которые либо равны логинам, либо являются их небольшой модификацией.
Для начала, кроме 6 млн. паролей от почтовых записей, я подключил к исследованию базу паролей с одного не-почтового сайта на 3.5 млн. записей. Это свежие записи (май 2015 года), содержащие достаточно мало невалидных паролей. Статистику по паролям с этого сайта я строил отдельно.
Пароль равен логину
Количество записей, где пароль равен логину: примерно 87 тысяч для почтовых паролей, 50 тысяч для паролей с сайта. Это много или мало? Для сравнения привожу два наиболее часто встречающиеся пароля (1 и 2 место в распределении). Также для удобства привожу значения в тысячных долях (‰) от общего количества паролей.
Частичное совпадение
Далее посмотрим, насколько часто встречаются случаи, где пароль – это небольшая модификация логина. Такие случаи не столь часты, зато это компенсируется небольшой сложностью атаки.
По частоте, все эти случаи попадают в топ-50 наиболее распространенных паролей:
Вывод
Сейчас на многих почтовых порталах (но очень редко на обычных сайтах и форумах) нельзя задать пароль, равный логину. Однако, за всё время мне встретился только один сайт, в котором нельзя было задать пароль, прибавив один символ к логину. Сайт так и писал: «ваш пароль очень похож на логин». Однако такая ситуация в современном интернете скорее исключение.
Между тем, атаки с подбором пароля путём небольшой модификации логина оказываются достаточно эффективными по частоте встречаемости, и не требующими большой сложности по количеству вариантов.
Конечно, если сравнивать интегральную сложность – атака по словарю несколько выгоднее. Зато, атаки модификацией логина не учитываются в системах безопасности даже на крупных порталах.
Предыдущий выпуск: Черная археология дата майнинга
В следующем номере: сравнение базы почтовых паролей с базой паролей не-почтового сайта. Насколько полезны оказались утекшие в 2014 году почтовые пароли?

Начать такое исследование меня побудила одна история, произошедшая в далёком 2000 году с неким молодым человеком. Не будучи хакером, он захотел взломать почтовый ящик одной особы. Её логин заканчивался на две цифры, примерно так: masha86@mail.com. После тривиальных паролей, которые не подошли, парень предположил, что пароль может выглядеть следующим образом: mashaDD, где DD – это две произвольные цифры. Сложность этой атаки всего 100 поп��ток, и примерно на двадцатой попытке пароль подошел, ящик был взломан. Чего только не сделаешь в молодости из-за ревности и ради любви...
Поэтому в сегодняшнем исследовании я решил проверить, насколько часто встречаются пароли, которые либо равны логинам, либо являются их небольшой модификацией.
Для начала, кроме 6 млн. паролей от почтовых записей, я подключил к исследованию базу паролей с одного не-почтового сайта на 3.5 млн. записей. Это свежие записи (май 2015 года), содержащие достаточно мало невалидных паролей. Статистику по паролям с этого сайта я строил отдельно.
Пароль равен логину
Количество записей, где пароль равен логину: примерно 87 тысяч для почтовых паролей, 50 тысяч для паролей с сайта. Это много или мало? Для сравнения привожу два наиболее часто встречающиеся пароля (1 и 2 место в распределении). Также для удобства привожу значения в тысячных долях (‰) от общего количества паролей.
| Почтовые пароли | Пароли с сайта | |||||
| Количество | ‰ | Количество | ‰ | |||
| Пароль равен логину | 86908 | 14.3 | Пароль равен логину | 49327 | 14.0 | |
| Топ-1 «123456» | 82830 | 13.6 | Топ-1 «qwerty» | 33322 | 9.5 | |
| Топ-2 «qwerty» | 53144 | 8.7 | Топ-2 «123456» | 21775 | 6.2 | |
Частичное совпадение
Далее посмотрим, насколько часто встречаются случаи, где пароль – это небольшая модификация логина. Такие случаи не столь часты, зато это компенсируется небольшой сложностью атаки.
| Почтовые пароли | Пароли с сайта | ||||
| Вид атаки | Сложность | Количество | ‰ | Количество | ‰ | 
| Пароль и логин отличаются на один последний символ  | 
~70 | 1835 | 0.30 | 20869 (!) | 5.93 | 
| Отличаются на два символа, причем на числа:  | 
100 | 1702 | 0.28 | 1226 | 0.35 | 
| Для пароля добавили один символ | ~100 | 5508 | 0.90 | 1930 | 0.55 | 
| Или два | ~10000 | 5087 | 0.84 | 3269 | 0.93 | 
| Добавили 4, но только цифры | от 100 до 10000  | 
7267 | 1.19 | 3252 | 0.92 | 
По частоте, все эти случаи попадают в топ-50 наиболее распространенных паролей:
Топ-50 почтовых паролей
| 123456 | 82830 | 
| qwerty | 53144 | 
| 123456789 | 23286 | 
| 111111 | 13831 | 
| qwertyuiop | 12399 | 
| qwe123 | 9021 | 
| 1234567890 | 8364 | 
| 1234567 | 7452 | 
| 12345 | 6420 | 
| password | 6410 | 
| 12345678 | 6374 | 
| 123321 | 6170 | 
| 7777777 | 5861 | 
| 123123 | 5533 | 
| 0 | 4977 | 
| 666666 | 4197 | 
| 1qaz2wsx | 4181 | 
| qazwsx | 4143 | 
| 1q2w3e4r | 3982 | 
| 654321 | 3760 | 
| 555555 | 3539 | 
| 123qwe | 2973 | 
| 1q2w3e4r5t | 2967 | 
| zxcvbnm | 2832 | 
| qweqwe | 2816 | 
| gfhjkm | 2806 | 
| 1q2w3e | 2748 | 
| klaster | 2695 | 
| 112233 | 2565 | 
| 121212 | 2445 | 
| 987654321 | 2371 | 
| 159753 | 2338 | 
| 777777 | 2204 | 
| qwer1234 | 2015 | 
| 1234qwer | 1999 | 
| qwerty123 | 1846 | 
| 1234 | 1801 | 
| asdfgh | 1779 | 
| abc123 | 1722 | 
| 123654 | 1568 | 
| 222222 | 1557 | 
| iloveyou | 1508 | 
| 987654321 | 1432 | 
| samsung | 1427 | 
| zxcvbn | 1422 | 
| ghbdtn | 1313 | 
| 88888888 | 1311 | 
| marina | 1284 | 
| 131313 | 1268 | 
| asdfghjkl | 1243 | 
Топ-50 паролей с сайта
| qwerty | 33322 | 
| 123456 | 21775 | 
| (пустой пароль) | 20002 | 
| UsdopaA (боты) | 16016 | 
| 123456789 | 8298 | 
| 1234567890 | 4117 | 
| qwertyuiop | 2247 | 
| 123321 | 2235 | 
| 1234567 | 2214 | 
| 1q2w3e4r5t | 2142 | 
| 111111 | 2004 | 
| 1q2w3e4r | 1682 | 
| 123qwe | 1554 | 
| 123123 | 1364 | 
| qazwsx | 1319 | 
| 1q2w3e | 1256 | 
| qazwsxedc | 1196 | 
| qwe123 | 1186 | 
| qweasdzxc | 1126 | 
| 9379992 | 1020 | 
| 0 | 1018 | 
| 4815162342 | 1015 | 
| iloveyou | 991 | 
| 12345678 | 979 | 
| 666666 | 977 | 
| zxcvbnm | 957 | 
| asdfgh | 930 | 
| Jskasgfdfjg | 923 | 
| gfhjkm | 914 | 
| qwertyuiop[] | 904 | 
| 1234qwer | 899 | 
| 1q2w3e4r5t6y | 890 | 
| qwerty123 | 839 | 
| nastya | 799 | 
| 555555 | 770 | 
| 987654321 | 755 | 
| ghbdtn | 746 | 
| 12345qwert | 740 | 
| 159753 | 737 | 
| loveyou | 735 | 
| 1234554321 | 716 | 
| 7777777 | 711 | 
| 1qaz2wsx | 708 | 
| 123123123 | 679 | 
| samsung | 670 | 
| 123qweasdzxc | 662 | 
| adidas | 642 | 
| asdfghjkl | 641 | 
| 789456123 | 636 | 
Вывод
Сейчас на многих почтовых порталах (но очень редко на обычных сайтах и форумах) нельзя задать пароль, равный логину. Однако, за всё время мне встретился только один сайт, в котором нельзя было задать пароль, прибавив один символ к логину. Сайт так и писал: «ваш пароль очень похож на логин». Однако такая ситуация в современном интернете скорее исключение.
Между тем, атаки с подбором пароля путём небольшой модификации логина оказываются достаточно эффективными по частоте встречаемости, и не требующими большой сложности по количеству вариантов.
Конечно, если сравнивать интегральную сложность – атака по словарю несколько выгоднее. Зато, атаки модификацией логина не учитываются в системах безопасности даже на крупных порталах.
R-код, если кому-то интересно
################################################
DATA <- readRDS( file = "ClearData.rds" )
################################################
################################################
# Всего записей: 3520000
nrow(DATA)
# Логин совпадает с паролем: 49327
length( which( DATA$login == DATA$passwd) )
################################################
# Для пароля добавили один символ: 1930
length( 
  which( 
    substr( DATA$login ,0, nchar(DATA$login) ) ==
      substr( DATA$passwd ,0, nchar(DATA$passwd)-1 ) 
  )
)
# Или два: 3269
length( 
  which( 
    substr( DATA$login ,0, nchar(DATA$login) ) ==
      substr( DATA$passwd ,0, nchar(DATA$passwd)-2 ) 
  )
)
################################################
# На четыре (но только на цифры): 3252
length( 
  which( 
    (
      substr( DATA$login ,0, nchar(DATA$login) ) ==
        substr( DATA$passwd ,0, nchar(DATA$passwd)-4 ) 
    ) & 
      (
        grepl(
          "\\d\\d\\d\\d",    
          substr( DATA$passwd ,nchar(DATA$passwd)-3,nchar(DATA$passwd) )
        )
      )
  )
)
################################################
# Пароль и логин отличаются на один последний символ: 20869
length( 
  which( 
          (
            substr( DATA$login ,0, nchar(DATA$login)-1 ) ==
            substr( DATA$passwd ,0, nchar(DATA$passwd)-1 ) 
          ) & ( DATA$login != DATA$passwd )
            
        )
)
################################################
# Отличаются на два символа (1477), причем на числа: 1226
length( 
  which( 
    (
      substr( DATA$login ,0, nchar(DATA$login)-2 ) ==
        substr( DATA$passwd ,0, nchar(DATA$passwd)-2 ) 
    ) & ( DATA$login != DATA$passwd ) &
      (
          substr( DATA$login ,0, nchar(DATA$login)-1 ) !=
          substr( DATA$passwd ,0, nchar(DATA$passwd)-1 ) 
      ) &
      (
        grepl(
          "\\d\\d",    
          substr( DATA$passwd ,nchar(DATA$passwd)-1,nchar(DATA$passwd) )
        )
      )
  )
)
################################################
################################################
### Строим топ паролей
library(dplyr)
tmpD <- DATA[,c(3,4)]
PASS_SUM <- summarise(group_by(tmpD,passwd), count = sum(count) )
PASS_SUM <- arrange(PASS_SUM,desc(count))
# Количество уникальных паролей: 2132935
nrow(subset(PASS_SUM, PASS_SUM$count==1))
# Количество невалидных паролей: 887
nrow(subset(PASS_SUM, PASS_SUM$count>64))
PASS_100 <- PASS_SUM[1:100,]
write.csv(PASS_100,file = "SpPassSum100.csv", row.names = F)
###########################################
Предыдущий выпуск: Черная археология дата майнинга
В следующем номере: сравнение базы почтовых паролей с базой паролей не-почтового сайта. Насколько полезны оказались утекшие в 2014 году почтовые пароли?
