Я хочу проанализировать пароли для уни проекта. Я хотел бы дать пароли R 50 для анализа, глядя на комбинации нижнего регистра, верхнего регистра, цифр и специальных символов. Я работаю с некоторым кодом R, взятым из https://datadrivensecurity.info/blog/posts/2014/Feb/ripal/, и я не могу заставить его работать.
В частности, R распознает только строчные буквы паролей, я не могу заставить его распознавать пароли, которые имеют другие комбинации символов, такие как верхний и нижний регистр, нижний и специальный и т. д., код продолжает возвращаться с 0%, когда я знаю, что есть пароли, соответствующие этим критериям, в 50 из моего фрейма данных.
Есть ли что-то, что я делаю неправильно, мои аргументы/код R правильны?
Любая помощь очень ценится.
contains.only.lower.alpha <- sum(grepl("^[a-z]+$",Final_DF$Pswd))
contains.only.upper.alpha <- sum(grepl("^[A-Z]+$",Final_DF$Pswd))
contains.only.numeric <- sum(grepl("^[0-9]+$",Final_DF$Pswd))
contains.only.special <- sum(grepl("^[:punct:]+$",Final_DF$Pswd))
contains.both.lower.and.upper <- only.lower.alpha + only.upper.alpha
contains.both.lower.and.numeric <- only.lower.alpha + only.numeric
contains.both.lower.and.special <- only.lower.alpha + only.special
contains.both.upper.and.numeric <- only.upper.alpha + only.numeric
contains.both.upper.and.special <- only.upper.alpha + only.special
contains.both.numeric.and.special <- only.numeric + only.special
contains.lower.upper.and.numeric <- only.lower.alpha + only.upper.alpha + only.numeric
contains.lower.upper.numeric.and.special <- only.lower.alpha + only.upper.alpha + only.numeric + only.special
print(sprintf("Only lowercase alpha = %d, (%3.3f%%)", only.lower.alpha, 100*(only.lower.alpha/50)))
print(sprintf("Only uppercase alpha = %d, (%3.3f%%)", only.upper.alpha, 100*(only.upper.alpha/50)))
print(sprintf("Only numeric = %d, (%3.3f%%)", only.numeric, 100*(only.numeric/50)))
print(sprintf("Only special = %d, (%3.3f%%)", only.special, 100*(only.special/50)))
print(sprintf("Both lower and upper alpha = %d, (%3.3f%%)", both.lower.and.upper, 100*(both.lower.and.upper/50)))
print(sprintf("Both lower and numeric = %d, (%3.3f%%)", both.lower.and.numeric, 100*(both.lower.and.numeric/50)))
print(sprintf("Both lower and special = %d, (%3.3f%%)", both.lower.and.special, 100*(both.lower.and.special/50)))
print(sprintf("Both upper and numeric = %d, (%3.3f%%)", both.upper.and.numeric, 100*(both.upper.and.numeric/50)))
print(sprintf("Both upper and special = %d, (%3.3f%%)", both.upper.and.special, 100*(both.upper.and.special/50)))
print(sprintf("Both.numeric.and.special = %d, (%3.3f%%)", both.numeric.and.special, 100*(both.numeric.and.special/50)))
print(sprintf("Lower.upper.and.numeric = %d, (%3.3f%%)", lower.upper.and.numeric, 100*(lower.upper.and.numeric/50)))
print(sprintf("Lower.upper.numeric.and.special = %d, (%3.3f%%)", lower.upper.numeric.and.special, 100*(lower.upper.numeric.and.special/50)))
Это 50 паролей, с которыми я работаю, которые я сгенерировал с помощью R. Я перегенерирую их, чтобы получить больший разброс, чтобы включить все специальные и т. д., После того, как я узнаю, что смогу заставить код работать.
> Final_DF$Pswd
[1] «обезьяна» «iloveyou» «дракон» «jbI2pnK$xi» «пароль» «компьютер» «!qessw»
[8] "tUNh&SSm6!" "солнце" "wYrUeWV" "супермен" "samsung" "utoXGe6$" "мастер"
[15] "wjZC&OvXX" "0R1cNTm9sGir" "Fbuu2bs89?" "покемон" "секрет" "x&W1TjO59" "бастер"
[22] "фиолетовый" "блеск" "цветок" "марина" "Tg%OQT$0" "SbDUV&nOX" "арахис"
[29] «ангел» «?1LOEc4Zfk» «компьютер» «человек-паук» «ничего» «$M6LgmQgv$» «оранжевый»
[36] «рыцарь» «американец» «глубинка» «TfuRpt3PiZ» «воздух» «прибой» «lEi2a$$eyz»
[43] «свидание» «V$683rx$p» «ньюкасл» «недвижимость» «фокси» «имбирь» «кофе»
[50] «ноги»
Где lower.upper.and.numeric
и lower.upper.numeric.and.special
? Я согласен с Ронаком в том, что нам нужен образец ввода (с использованием dput
) и ожидаемый результат. Для чего здесь предназначен /50
? Проблема с методологией заключается в том, что вы специально ищете строки, которые являются только числами, например 124234
, или только строчными буквами, например abcas
, а затем пытаетесь объединить эти две части логики, чтобы найти, есть ли 123abc
там. Вам нужно будет разрешить другое значение в строке, например contains.upper.alpha <- grepl("^.*[A-Z]+.*$",Final_DF$Pswd)
Привет, @JonnyPhelps, 50 — это общее количество проверяемых паролей, я использую его для расчета %.
Я думаю, что мне нужно привести в порядок/сделать значения более понятными, содержит гораздо лучший способ объяснить, что проверяемый пароль имеет верхний и нижний регистр и т. д. На данный момент проблема в том, что я не могу заставить R распознать и подсчитать пароль, который имеет как верхний, так и нижний регистр
Что-то вроде data <- "abcABC"; grepl("^.*[a-z]+.*$",data) & grepl("^.*[A-Z]+.*$",data)
. Вам нужны условия, которые проверяют, есть ли строчные или прописные буквы, а затем объединяют их. Таким образом, вы можете обернуть это суммой, т.е. выполнить сумму после выполнения комбинированного логического теста.
@RonakShah, я предоставил данные, с которыми работаю, если это поможет
@JonnyPhelps, спасибо, я попробовал ваше предложение, но оно все равно не работает так, как хотелось бы, [1] "abcABC" [1] ЛОЖЬ ЛОЖЬ ЛОЖЬ ЛОЖЬ ИСТИНА ЛОЖЬ ЛОЖЬ ЛОЖЬ ИСТИНА ИСТИНА ЛОЖЬ ИСТИНА ЛОЖЬ ЛОЖЬ ИСТИНА ЛОЖЬ ИСТИНА ИСТИНА ИСТИНА ИСТИНА ЛОЖЬ [19] ] FALSE TRUE FALSE FALSE FALSE FALSE FALSE TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE [37] FALSE FALSE TRUE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE. Пароль номер 4, например, jbI2pnK$xi, который этот новый код читает как истинный, когда он должен быть ложным, поскольку он содержит нижний, верхний, цифры и специальные символы.
Я знаю, что мой список паролей содержит 34 пароля только в нижнем регистре, 2 пароля, которые имеют только нижний и верхний регистр, 1 пароль со строчными буквами и специальный, 2 пароля со строчными, прописными и специальными, 11 паролей с нижними, верхними, номера и спец.
Тест работает для jbI2pnK$xi
, так как у него есть нижний и верхний регистр. Вам нужно расширить эту логику, например, если вы хотите нижний, верхний и специальный, вам нужно продолжать складывать условия, например grepl("^.*[a-z]+.*$",data) & grepl("^.*[A-Z]+.*$",data) & grepl(".*^[:punct:]+.*$")
Поэтому определите базовые условия для содержания нижнего, верхнего, специального и т. д., затем объедините их по мере необходимости, а затем просуммируйте в конце. Вы можете заменить 50 на nrow(Final_DF)
, чтобы стандартизировать это.
Кроме того, поделитесь данными с dput
и скопируйте этот вывод :)
@JonnyPhelps извините, я не могу заставить работать dput в комментариях, есть идеи? Используя ваш последний пример, я получаю два вывода TRUE для tUNh&SSm6! и utoXGe6$, которые содержат нижний, верхний, специальный и числа, когда я хотел только нижний, верхний и специальный. Мне интересно, должна ли логика включать аргументы исключения, использование регулярных выражений и т. д., Чтобы R знал, что не следует включать tUNh & SSm6! в этом поиске, так как он содержит число и не соответствует критериям
Разобрался, нужна комбинация логических операторов для каждой комбинации символов пароля
grepl("^(?!.*[[:lower:]]).*$",df, perl = TRUE)
Пожалуйста, облегчите жизнь людям, которые пытаются вам помочь. Предоставьте воспроизводимый пример вместе с ожидаемым результатом. Читайте о как привести воспроизводимый пример.