class PasswordStrengthMeter
Public Class Methods
evaluate(username, password)
click to toggle source
# File lib/password_strength_meter.rb, line 2 def self.evaluate(username, password) puntuacion = 1.0 if password.match(/[A-Z]/).nil? puntuacion -= 0.2 end if password.match(/[a-z]/).nil? puntuacion -= 0.2 end if password.match(/[0-9]/).nil? puntuacion -= 0.1 end if password.length <= 5 puntuacion -= 0.3 end if password.length <= 7 puntuacion -= 0.1 v end similitud = (1.0 - (PasswordStrengthMeter.jaro_winkler(username, password, true) || 0.0)) similitud = 1.0 if similitud.nil? or similitud.nan? puts "Score: #{puntuacion.to_s} Similarity: #{similitud.to_s}" evaluacion = (puntuacion * similitud) evaluacion = (evaluacion).round(4) end
jaro_winkler(str1, str2, winkleradjust=false)
click to toggle source
# File lib/password_strength_meter.rb, line 33 def self.jaro_winkler(str1, str2, winkleradjust=false) m = 0 tr = 0 s1 = str1.strip.split(//) s2 = str2.strip.split(//) s1l = s1.length s2l = s2.length if s1l > s2l tmp = s2 s2 = s1 s1 = tmp end found = Hash[*s2.uniq.sort.collect { |v| [v,0]}.flatten] md = (([s1l,s2l].max / 2) - 1).to_i s1.each_with_index do |c,i| if !found[c].nil? if !s2.aindices(c)[found[c]].nil? x = (s2.aindices(c)[found[c]] - i).abs if x <= md found[c] += 1 m += 1 if (x != 0) tr += 1 end end end end end tr = (tr/2).to_i third = 1.0/3 jd = (third * m / s1l) + (third * m / s2l) + (third * (m - tr) / m) out = jd if winkleradjust l = 0 (0..s1l-1).each { |i| s1[i]==s2[i] ? l+=1 : break } out = jd + (l * 0.1 * (1 - jd)) end end