Notifications
Clear all

Compartilhando Conhecimento

24 Posts
3 Usuários
0 Reactions
3,008 Visualizações
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa noite, Srs.

Estou aqui compartilhar o conhecimento dessa vez.
Vi alguns tópicos, quanto a dificultar a planilha com senhas e tudo mais, em meu caso foi diferente a necessidade, a planilha tem um limite de vezes a ser utilizada, e para atender a minha necessidade montei um algoritmo que gera uma chave.

Lógica da Chave:
1. Identifica o mês atual
2. Fatia o mês letra por letra
3. Identifica qual a posição de cada letra no alfabeto
4. Encontra a posição(J = 10, A = 1 ...) , multiplica por 7 (ou qualquer outro número de sua escolha) deixando a com três casa decimais (J= 070, A = 007 ...)
5. Concatena letra a letra montado uma sequência com a posição da letra (070007...)
6. Pega a data atual em número serial, insere no inicio da sequência gerada acima (42422070007...)
7. Feito tudo isso deixa a sequencia com 32 caracteres (42422070007...)

Chave: 42423720602640602160601082161800
Data = 42423
F = 720
E = 602
V = 640
E = 602
R = 160
E = 601
I = 082
R = 161
O = 800

Obs.: A chave e valida para o dia, se for digitado no dia seguinte não vale mais, e necessário um nova chave para aquele dia.

O arquivo que montei é coisa bem simples, na Plan1 na célula A1 esta sendo incrementada a cada vez que o arquivo é aberto conforme evento Workbook_Open executado em EstaPasta_de_trabalho, a minha necessidade era limitar a quantidade de vezes a serem aberto o arquivo, para isso declarei uma variável com a quantidade que desejo que ela solicite a renovação de chave, e a cada vez que o arquivo for aberto alem de incrementar a celula A1, realiza a comparação com o valor da célula A1 com a quantidade da variável.
Quando aplicação esta estiver faltando 3 utilizações o usuário será notificado por uma mensagem que a renovação da chave esta próxima.

Após expirar a chave de utilização da aplicação será solicitado uma nova chave, onde o usuário terá três tentativa de digitar uma chave valida.

Em seguida será solicitado a nova chave de ativação da aplicação através de um inputbox

O algoritmo verifica se a chave corresponde com os parâmetros da lógica e valida a utilização pela quantidade definida.
Geração da chave e realizada via UserForm

Ao clicar em "Ok" copia a chave, para ser enviar ao usuário.

Galera como disse no inicio é coisa bem simples que montei, estou aqui compartilhando com todos o conhecimento, sei muito bem que pode ser melhorada a lógica e a ideia, anexo tem o arquivo para ser melhorado.

É isso ai galera, espero que tenha conseguido, passar algo de produtivo, agradeço a todos pelo tempo e ajuda que nos fornece.

 
Postado : 22/02/2016 6:30 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Estou no celular. Amanhã baixo e dou uma olhada...
Já fiz isso e gostei da ideia...

Fiz um onde a validação seria online. Hospedei um xml com um código de permissão em meu site e a cada vez que o usuário fizesse o acesso, ele teria que apertar um botão que consultava esse xml automaticamente e liberava o acesso. Caso eu remova o xml ou até mesmo alterava o código contido no xml, outras pessoas não utilizariam mais a planilha, caso ela tenha vazado na internet.

Porém, prevendo os problemas de internet, incluí um checkbox antes de precionar o botão, que liberava um textbox e você preencheria com a chave, onde a chave validaria apenas naquele dia.

Fiz isso para uma contabilidade que minha mulher trabalha, para judar apenas ela, e que a contabilidade não tomasse posse da planilha, pois facilitava a inclusão do cadastro de uns 500 tomadores exclusivos de retensão no arquivo SEFIP.RE para a transmissão da GFIP. Isso deveria ser cadastrado manualmente no SEFIP e é um saco...
Quando estava 98% pronto, o cliente dessa demanda saiu da contabilidade. Henfim... Mais uma planilha morta.

Mas faz parte.

Qualquer coisa da o grito.
Abraço

 
Postado : 22/02/2016 9:43 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Cara, bacana...

Um problema (na minha opinião) é a quantidade de números para digitar que fica um pouco inviável... Tipo, chato para digitar, sabe... É como pagar um boleto utilizando a linha digitável invés de utilizar o leitor de código de barras.

O meu desafio era uma chave curta, porém, eu não faria bem uma criptografia simétrica e sim um Hash de comparação, onde eu poderia cair em uma vulnerabilidade onde é possível que duas strings diferentes produzam o mesmo hash.
Um exemplo muito grande é o próprio Excel. Proteja a worksheet utilizando a senha "123" (sem as aspas, claro). após a planilha estar protegida, desproteja-a utilizando a senha "900". Simples. kkkkkkkk

Cara, São ideias muito boas, mas para ser sincero, já cheguei a pirar de tanto estudar isso, pois onde achava uma solução muito boa, eu mesmo achava uma vulnerabilidade lógica, onde claramente muitas pessoas não teriam ideia e as vezes somente eu conseguiria pois sei o que estou fazendo (quem sabe fazer remédio também sabe fazer veneno), porém não me dei por convencido ainda...

Bom, tempo tá meio corrido. Somente como sugestão, pode deixar assim:

Option Explicit

Private Sub UserForm_Initialize()
Dim vDia    As String
Dim vMes    As String
Dim vLetra  As String
Dim i       As Integer
Dim j       As Integer
Dim VSenha  As String
Dim VChave  As String

    vDia = CLng(Now)
    vMes = Format(CDate(Now()), "MMMM")

    For i = 1 To Len(vMes)
        vLetra = Mid(vMes, i, 1)
        For j = 1 To 26
            If UCase(vLetra) = Chr(j + 64) Then
                VSenha = Format(VSenha, "000") & Format(j * 12, "000")
            End If
        Next j
    Next i

    VChave = PreencherZeros(vDia & VSenha, 32, False)

    Me.TextBoxChave.Value = VChave

End Sub

Somente para não reinventar a roda no código, nenhuma outra modificação.

Qualquer coisa da o grito.
Abraço

 
Postado : 23/02/2016 7:02 am
(@trindade)
Posts: 0
New Member
Topic starter
 

Bom dia, Bernardo.

Obrigado pelas ponderações, como eu disse o que montei é bem simples.

Uma ressalva

Um problema (na minha opinião) é a quantidade de números para digitar que fica um pouco inviável... Tipo, chato para digitar, sabe... É como pagar um boleto utilizando a linha digitável invés de utilizar o leitor de código de barras.

Já pensando nesse detalhe, o botão "OK" da tela que gera a chave, ao clicar alem de fechar o UserForm realiza a seleção de todos os números e faz a função de copiar, sendo assim evita a digitação dos 32 caracteres.

Sua sugestão no código ficou muito bacana, mais enxuta.

Valew, pela troca de informação!

 
Postado : 23/02/2016 7:28 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Cara, infelizmente, penso eu, que não se deve deixar o "keygen" com o usuário.
O seu por exemplo, pode ser utilizado uma certa quantidade de vezes. Se eu utilizar, fechar a planilha sem salvar, vou ter ela infinitamente.
Pode surgir a ideia de salva-la automaticamente ao ser fechada. Blz.... A pessoa faz uma cópia da planilha e sempre utiliza uma cópia dela, ou salva no email ou algum disco virtual, sempre que precisar, é só baixar. "vou ter ela infinitamente" [2]

A outra ideia que tive, (até fiz em uma outra planilha onde utiliza a mesma lógica), a chave era uma data a determinar. Por exemplo. Eu geraria uma chave que vence no dia 31/03/2016. Que seja de mês em mês, ano em ano, semestre em semestre... Eu passaria para a pessoa por email, telefone ou seja lá onde for. E digitar uma sequencia dessa por telefone é foda...
Porém, se eu voltar a data do windows, vai liberar o acesso.

A que eu mais gostei foi a do XML que eu fiz. você ainda pode fazer uma lista no XML onde verificaria o cadastro da máquina e seria administrado nesse xml criptografado...

Mas, o jeito é adotar um critério mesmo... Tudo dependendo da necessidade e importância da planilha...

Qualquer coisa da o grito.
Abraço

 
Postado : 23/02/2016 7:38 am
(@trindade)
Posts: 0
New Member
Topic starter
 

bernardo

Poderia disponibilizar um modelo utilizando XML, não faço nem ideia como montar ou indicar algum link com ideias.

 
Postado : 23/02/2016 7:41 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Segue anexo.

Removi os códigos que "fazem a planilha funcionar" e deixei somente a estrutura...

Ao abrir o formulário, ela vai estar toda travada. Para utiliza-la, terá que clicar em "Validar". Ele vai reconhecer o xml e vai liberar.

Basta fechar o form que ele vai pedir novamente. Se não estiver online, marque o checkbox e digite "500515054" (sem as aspas) que vai funcionar para hoje.

Está bem simples...

Qualquer coisa da o grito.
Abraço

 
Postado : 23/02/2016 7:54 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Trindade, analisando um pouco mais o seu código, não foi muito difícil identificar a sequencia que ele utiliza.
A chave de hoje é:
42423720602640602160601082161800
A chave de amanhã:
42424720602640602160601082161800
A chave de depois de amanhã:
42425720602640602160601082161800
E assim sucessivamente. Até chegar no mês de março.

No mês de março continua essa sequencia mas altera o final:
42430156012216180000000000000000
42431156012216180000000000000000

Se a pessoa for no mínimo curiosa, ela vai identificar isso e mais uma vez, reduziria a quantidade de vezes que abriria a planilha. Haveria a necessidade de abrir apenas uma vez no mês.

Qualquer coisa da o grito.
Abraço

 
Postado : 23/02/2016 8:28 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Tocando nesse assunto acima, não adianta muito 32 dígitos se tem essa "invulnerabilidade". Eu prefiro menos dígito e ter, digamos, uma maior variação, do que trocentos dígitos e ser sequencial, como é o caso...
01/03/2015 - 42064156012216180000000000000000
01/03/2016 - 42430156012216180000000000000000
01/03/2017 - 42795156012216180000000000000000

Claro que não vai ser fácil acertar isso. Mas seria como os cupons de desconto em sites de compra online, São normalmente OFF50 ou algo do tipo, coisas, digamos, que idiotas... mas vai acertar pra ver... kkkkkk

O que estou pensando em fazer é o Hash MD5... não sei se chega a ser inviável ou não, mas tentarei. Se conseguir eu posto no planilhando.
O inicial projeto dessa minha criptografia foi para salvar senha, pois planilha com acesso através de login e senha em formulário, as senhas ficam visíveis, e fiz isso nesse objetivo... Daí fui adaptando...

Qualquer coisa da o grito.
Abraç

 
Postado : 23/02/2016 8:43 am
(@trindade)
Posts: 0
New Member
Topic starter
 

Boa tarde, Bernardo.

Analisando o que disse pensei em alguns detalhes a serem melhorados:

1. Alteração do código que gera a chave, utilizando sua dica Chr(j + 64) e o multiplicar não é mais fixo agora pego a dia atual com 2 dígitos faço a subtração pelo ano com 2 dígitos verifico se 0 valor é negativo e transformo para positivo e a partir dele sera realizada a multiplicação ficando assim:

Private Sub UserForm_Initialize()
Dim vDia As String
Dim vMes As String
Dim vLetra As String
Dim i As Integer
Dim j As Integer
Dim VSenha As String
Dim VChave As String
Dim vDif As Long
Dim vMultiplicador As Long

    vDia = CLng(Now + 2)
    vMes = Format(CDate(Now()), "MMMM")
    
    vDif = (Format(vDia, "DD") - Format(vDia, "YY"))
    
    If vDif < 0 Then
        vMultiplicador = vDif * -1
    Else
        vMultiplicador = vDif
    End If
        
    For i = 1 To Len(vMes)
        vLetra = Mid(vMes, i, 1)
        For j = 1 To 26
            If UCase(vLetra) = Chr(j + 64) Then
                VSenha = Format(VSenha, "000") & Format(j * vMultiplicador, "000")
            End If
        Next j
    Next i
    
    VChave = PreencherZeros(vDia * vMultiplicador & VSenha, 32, False)

    Me.TextBoxChave.Value = VChave

End Sub

Acho que agora os 32 dígitos vai dificultar um pouco

Dentro do mesmo mês:
25/02/2016 = 38182554045198045162045081162135
26/02/2016 = 42426060050220050180050090180150
27/02/2016 = 46669766055242055198055099198165

A mesma data em anos diferente:
25/02/2015 = 42060060050220050180050090180150
25/02/2016 = 38182554045198045162045081162135
25/02/2017 = 34232848040176040144040072144120

Outro detalhe que incrementei foi inserir em EstaPasta_de_trabalho o código que verifica se o nome do arquivo foi alterado, se sim salva e fecha com seguinte código:

Option Explicit
Private Const Nome_Arquivo As String = "Arquivo_Teste.xlsm"

Private Sub Workbook_Open()

Dim Nome As String

Nome = ThisWorkbook.Name

    If Nome <> Nome_Arquivo Then
        ActiveWorkbook.Save
        ActiveWorkbook.Close
		MsgBox "Nome da aplicação foi alterado" & vbNewLine & "Aplicação será encerrada...", vbInformation, "Obrigado"
    End If

End Sub

Isso dificulta realizar copias e alterar o nome.
O bacana do seu retorno é que instiga minar as possibilidades do utilizador da aplicação de burlar seu projeto.

Duvida ???
É possível alterar o valor de uma variável publica dentro de um módulo, assim não preciso ler uma célula especifica.

 
Postado : 24/02/2016 3:35 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Bom dia Trindade.

Cara, Depois dou mais atenção ao tópico... Somente para responder a pergunta final.

Não entendi o porque de querer alterar o valor de uma variável pública dentro de um módulo, mas basta utilizar "Const NomeVariavel = "Novo valor":
Exemplo:

Option Explicit

Private Const Nome_Arquivo As String = "Arquivo_Teste.xlsm"

Private Sub teste()

    Const Nome_Arquivo = "teste" 'Novo valor da variável
    MsgBox "Variavel alterada para: " & Nome_Arquivo

End Sub

Qualquer coisa da o grito.
Abraço

 
Postado : 25/02/2016 5:58 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Segue somente um ajuste no código.
Depois analiso melhor.

Private Sub UserForm_Initialize()
Dim vDia    As String
Dim vMes    As String
Dim i       As Integer
Dim VSenha  As String
Dim VChave  As String
Dim vMult   As Long

    vDia = CLng(Now + 2)
    vMes = Format(CDate(Now()), "MMMM")
   
    vMult = Abs((Format(vDia, "DD") - Format(vDia, "YY")))
    
    For i = 1 To Len(vMes)
        VSenha = Format(VSenha, "000") & Format((Asc(UCase(Mid(vMes, i, 1))) - 64) * vMult, "000")
    Next i
   
    VChave = PreencherZeros(vDia * vMult & VSenha, 32, False)

    Me.TextBoxChave.Value = VChave

End Sub

Qualquer coisa da o grito.
Abraço

 
Postado : 25/02/2016 6:38 am
(@trindade)
Posts: 0
New Member
Topic starter
 

Bom dia, Bernardo.

Não entendi o porque de querer alterar o valor de uma variável pública dentro de um módulo

Alteração do valor da variável seria para o contador de vezes de acesso, onde ficaria dentro do código da aplicação, hoje o meu contador esta em uma Plan, eu queria ver se tem a possibilidade de colocar dentro do código, para não ficar refém de uma célula.

 
Postado : 25/02/2016 6:45 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Aaaaaahhh, agora entendi.
Então não é dessa forma não.

Você terá que "Confiar no acesso ao modelo de objeto do projeto do VBA" dentro da "Central de Confiabilidade".

Vou dar uma olhada aqui...

 
Postado : 25/02/2016 6:52 am
(@edsonbr)
Posts: 0
New Member
 

Bom dia Sres. Trindade e Bernardo. Discussão interessante essa de vcs!

Só prá botar mais lenha na fogueira :mrgreen:, gostaria de compartilhar também outras duas formas de aumentar a proteção que, embora já um pouco batidas (são de pelo menos uns 15 anos atrás) e também vulneráveis, podem ajudar a aumentar o grau de dificuldade para quem queira burlar sua criação.

Uma delas, mais simples, seria criar (manualmente) uma propriedade personalizada (CustomDocumentProperties) digamos "NúmUsos" originalmente com valor em 0 e então no código do evento Open, colocar instruções para incrementar em 1 o valor de "NúmUsos" e verificar se já atingiu o limite. Por exemplo:

Private Sub Workbook_Open()
  Const LimiteUsos As Integer = 3
  With ThisWorkbook.CustomDocumentProperties("NúmUsos")
     If .Value <= LimiteUsos Then
       .Value = .Value + 1
     Else
        'código caso tenha ultrapassado limite de usos
     End If
  End With
End Sub

A outra, mais elaborada, seria alterar uma chave personalizada no registro do Windows que poderia iniciar em zero e ser atualizada a cada abertura da sua pasta de trabalho, incrementando em 1. O código do link abaixo traz um exemplo mas foi postado há muito tempo ("Erlandsen Data Consulting" - Noruega) e dá uma noção de que seria possível fazer dessa forma. Logicamente será necessário adaptar o código (aliás nem sei se ainda é possível com os novos Windows... :cry: ). Pelo menos a idéia continua válida. Veja em:

http://erlandsendata.no/?p=2155

Logicamente tanto uma como outra são vulneráveis e dependem do nível de "expertise" do camarada usuário. A principal vantagem da primeira é que as alterações vão junto com o arquivo enquanto que a da alteração do registro bastaria instalar em outra máquina e iniciaria do zero de novo. Mesmo assim, particularmente prefiro esta última, pois dificilmente alguém se aventura no Registry do Windows para fazer alguma alteração manual.

Entretanto vc poderia fazer uma combinação entre todas essas ferramentas e, caso uma tenha sido violada haveria como checar através da outra que houve uma inconsistência, emitindo alertas, etc.

 
Postado : 25/02/2016 10:31 am
Página 1 / 2