/** Entropia de Senha ----------------- Funcao: EntropiaSenha( xcSenha ) Parametro: xcSenha - A senha passada para o calculo. Retorna: Valor da Entropia | Categoria ------------------+-------------------------- 0 ate 24 | Senha Pobre 25 ate 49 | Senha Fraca 50 ate 74 | Senha Regular maior que 75 | Senha Forte **/ #include "box.ch" #include "inkey.ch" FUNCTION Main() LOCAL xcSenha := SPACE(50) LOCAL nResultado LOCAL cCorTipoSenha := "" CLS @ 0, 2 SAY "Entropia de Senha" WHILE .T. xcSenha := SPACE(50) nResultado := 0 @ 1, 0, MaxRow(), MaxCol() BOX SPACE(9) @ MaxRow(), 0 SAY "ESC - Sair " @ 2, 2 SAY "Digite uma senha:" @ 3, 2 GET xcSenha READ IF LASTKEY() == K_ESC EXIT ENDIF nResultado := Entropia_Senha( xcSenha ) IF nResultado <= 24 cPesoSenha := "Senha Pobre" cCorTipoSenha := "GR+/R" ELSEIF nResultado >= 25 .AND. nResultado <= 49 cPesoSenha := "Senha Fraca" cCorTipoSenha := "R+/N" ELSEIF nResultado >= 50 .AND. nResultado <= 74 cPesoSenha := "Senha Regular" cCorTipoSenha := "GR+/N" ELSEIF nResultado >= 75 cPesoSenha := "Senha Forte" cCorTipoSenha := "G+/N" ENDIF @ 5, 2 SAY "A Entropia dasenha digitada: " cCor := SETCOLOR() SETCOLOR( cCorTipoSenha ) @ 5, COL()+1 SAY cPesoSenha SETCOLOR( cCor ) @ 6, 2 SAY nResultado @ MaxRow(), 0 SAY "Tecle ENTER para continuar..." INKEY(0) ENDDO RETURN Nil FUNCTION Entropia_Senha( xcSenha ) LOCAL nTamanho := LEN(ALLTRIM(xcSenha)) LOCAL nFaixa := 0 LOCAL nTemMaiusculo := 0 LOCAL nTemMinusculo := 0 LOCAL nTemNumero := 0 LOCAL nRetorno := 0 FOR x := 1 TO nTamanho nTemMaiusculo += iif( IsUpper(SUBSTR(xcSenha, x, 1)), 1, 0 ) nTemMinusculo += iif( IsLower(SUBSTR(xcSenha, x, 1)), 1, 0 ) nTemNumero += iif( IsDigit(SUBSTR(xcSenha, x, 1)), 1, 0 ) NEXT nFaixa += iif( nTemMaiusculo > 0, 26, 0 ) nFaixa += iif( nTemMinusculo > 0, 26, 0 ) nFaixa += iif( nTemNumero > 0, 10, 0 ) nRetorno := nTamanho * log2(nFaixa * 2) RETURN nRetorno FUNCTION log2( n ) LOCAL nResultado := 0 IF n <= 0 RETURN -1 ENDIF WHILE n > 1 n /= 2 nResultado += 1 ENDDO RETURN nResultado