Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
Composition Setup
import.css=/download/attachments/327912/newLayout.css

...

Pagetitle
PrivVeryRSA
PrivVeryRSA

...

Função: PrivVeryRSA

Inclusão de trecho
advpl - deprecated
advpl - deprecated
nopaneltrue

Verifica um determinado conteúdo assinado, usando a chave

...

pública.

Sintaxe

Bloco de código
collapsefalse
PrivVeryRSA( <
cPathKey>
 cKeyOrPathKey >, <
cContent>
 cContent >, <
nTipo>
 nType >, <
cAssinado>
 cAssinatura >, [
cErrStr
 @cErrStr ], [ nPad ] )
--> lRet

Parâmetros

...

Nome

Tipo

Descrição

Obrigatório

Referência

...

cKeyOrPathKey

...

character

Indica a string que contém o caminho

...

para a chave privada (formato .PEM) ou o conteúdo do arquivo.

...

X

...


cContent

...

character

Indica o valor que será verificado, com um conteúdo já assinado.

X

...


nType

...

numeric

...

Indica

...

o tipo de algoritmo que será utilizado para verificar a assinatura

...

.

X

...


cAssinatura

...

character

Indica uma string que contém o valor

...

da assinatura gerada mediante a aplicação da chave privada criptografada.

X

...


cErrStr

...

character

Indica a

...

variável para retornar as mensagens de erro.

...


X

...

nPad

...

numeric

Indica o tipo de schema de criptografia que será utilizado.

...



Retorno

Nome

Tipo

Descrição

lRet

logical

...

 

...

Retorna verdadeiro (.T.)

...

se o valor informado

...

no parâmetro

...

cContent está de acordo com o valor enviado que foi assinado

...

pelo tipo

...

nTipo e a chave informada

...

cPathKey. Caso contrário, falso (.F.).

Observações

Nota
icontrue
titleAtenção

A funcionalidade de uso da chave ao invés do path está disponível apenas em versões iguais ou superiores a 17.3.0.18.

Essa função utiliza uma chave pública para verificar a assinatura. A chave pública correta para a validação deve ser gerada a partir da chave privada usada para realizar a assinatura, e deve ser fornecida pelo agente que gerou a assinatura. Para isso, é necessário informar o caminho (path) da chave pública

...

no parâmetro

...

cKeyOrPathKey, ou seu conteúdo, e, em seguida, o conteúdo

...

cHash a ser validado, o tipo do Hash Criptográfico informado e a assinatura a ser verificada.

Tipo de algoritmo válido para o parâmetro nType:

 

...

Valor

Algoritmo

...

1

...

MD5

...

2

...

SHA1

...

3

...

RIPEMD160

...

4

MD5_

...

 

SHA1

5

SHA256WithRSA

6

SHA256

...

Tipo

...

de schema válido para o parâmetro nPad:

Valor

Schema

...

1

PKCS1

...

2

SSL

...

3

NO

...

4

PKCS1_OAEP

5

X931

...

Caso não seja passado nenhum schema de criptografia (nPad), a

...

função assume

...

com padrão o schema 1 - PKCS1.

Os valores 5 e 6 no parâmetro nType estão disponíveis em versões superiores a 13.2.3.0.

Caso seja informado no parâmetro cKeyOrPathKey um caminho de arquivos no client ou não tenha o conteúdo de uma chave privada, será adicionado ao parâmetro cErrStr a mensagem "[PrivVeryRSA] Only server path or private key content are allowed." e retornará Nil.

Se forem passados valores inválidos no parâmetro nType, o programa será finalizado com a mensagem de erro fatal "Invalid hash algorithm".

Em caso de erro abrir o arquivo informado no parâmetro cKeyOrPathKey, será adicionado ao parâmetro cErrStr a mensagem "Fail open PEM file.".

Em caso de erro na leitura do arquivo informado no parâmetro cKeyOrPathKey, será adicionado ao parâmetro cErrStr a mensagem "Fail read RSAPublicKey.".

Se houver erro no processamento da assinatura, será adicionado ao parâmetro cErrStr a mensagem "Fail execute RSA verify.".

A partir da versão 20.3.3.0 o algoritmo SHA256WithRSA (valor 5 de nType) e o schema SSL (valor 2 de nPad) serão inválidos.

Em builds iguais ou superiores a 24.3.0.0 essa função é obsoleta.

Exemplos

Bloco de código
languagecpp
themeEclipse
linenumberstrue
collapsefalse
User Function RSAVeryPath()
  Local sPrivKeyPath := "private.pem"
  Local sPubKeyPath := "public.pem"
  
.

 

User Function RSA_Sign()
Local sStr := 
'
"01234567890123456789
'
"
  

Local 
sOut
cMD5 := ''

sStr

  Local sSign := ""
  
  // Conteudo a ser assinado
  varinfo( "sStr", sStr )
  
  // Hash MD5 gerado a partir desse conteudo
  cMD5 := Md5( sStr )
  

varinfo( 
'1'
"cMD5", 
sStr )
sOut
cMD5 )
  
  // Assinatura gerada a partir do Hash MD5 usando a chave privada
  sSign := PrivSignRSA
( 'private.pem', sStr, 1, 'assinatura' )
varinfo( 'sOut', sOut )
conout( PrivVeryRSA( 'public.pem', sStr, 1, sOut ) )
Return
Advanced Protheus 7.10 , Microsiga Protheus 8.11 , Protheus 10 , TOTVS Application Server 10
 
( sPrivKeyPath, cMD5, 1, "senhachaveprivada" )
  varinfo( "sSign", sSign )
  
  // Verificando a assinatura usando a chave pública
  If PrivVeryRSA( sPubKeyPath, cMD5, 1, sSign )
    conout('Signature Check OK')
  Else
    conout('Signature Check FAILED')
  Endif
Return

User Function RSAVeryKey()
  Local sPrivKey
  Local sPubKey
  Local sStr := "01234567890123456789"
  Local cMD5 := ''
  Local sSign := ""
  
  sPrivKey := "-----BEGIN PRIVATE KEY-----" + chr(10)
  sPrivKey += "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJSn+hXW9Zzz9ORB" + chr(10)
  sPrivKey += "KIC9Oi6wzM4zhqwHaKW2vZAqjOeLlpUW7zXwyk4tkivwsydPNaWUm+9oDlEAB2ls" + chr(10)
  sPrivKey += "QJv7jwWNsF7SGx5R03kenC+cf8Nbxlxwa+Tncjo6uruEsK/Vke244KiSCHP8BOuH" + chr(10)
  sPrivKey += "I+r5CS0x9edFLgesoYlPPFoJxTs5AgMBAAECgYBL/6iiO7hr2mjrvMgZMSSqtCaw" + chr(10)
  sPrivKey += "kLUcA9mjRs6ZArfwtHNymzwGZqj22ONu5WqiASPbGCO0fI09KfegFQDe/fe6wnpi" + chr(10)
  sPrivKey += "rBWtawLoXCZmGrwC+x/3iqbiGJMd7UB3FaZkZOzV5Jhzomc8inSJWMcR+ywiUY37" + chr(10)
  sPrivKey += "stfVDqR1sJ/jzZ1OdQJBAO8vCa2OVQBJbzjMvk8Sc0KiuVwnyqMYqVty6vYuufe9" + chr(10)
  sPrivKey += "ILJfhwhYzE82wIa9LYg7UK2bPvKyyehuFfqI5oU5lU8CQQCfG5LA3gp3D1mS7xxz" + chr(10)
  sPrivKey += "tqJ+cm4SPO4R6YzVybAZKqKUvTFSKNV57Kp/LL7WjtUUNr+dY+aYRlKo81Hq61y8" + chr(10)
  sPrivKey += "tBT3AkAjJyak+2ZCxIg0MONHe8603HWhtbdygQ1jA2DFDdkHMCS+EowmDeb5PXLO" + chr(10)
  sPrivKey += "Wr92ZkFVQpvdz6kdIBDa4YP/0JbBAkBVHLjqd1z9x7ZRBZwgwkg2gBwloXZxGpB+" + chr(10)
  sPrivKey += "JMARFl+WVYa2vqVD7bhfA56qxAl0IL1sAm7ucl/xhQgDNRiM0YCNAkEAqySTBx2H" + chr(10)
  sPrivKey += "O9VyzuWWbf7BYTNsxfO80GaRkZGENfqO1QgnhT1FMeK+ox7Kbi+nSaCBoPjNzyrM" + chr(10)
  sPrivKey += "bU08M6nSnkDEGA==" + chr(10)
  sPrivKey += "-----END PRIVATE KEY-----" + chr(10)
  
  sPubKey := "-----BEGIN PUBLIC KEY-----" + chr(10)
  sPubKey += "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCUp/oV1vWc8/TkQSiAvTousMzO" + chr(10)
  sPubKey += "M4asB2iltr2QKozni5aVFu818MpOLZIr8LMnTzWllJvvaA5RAAdpbECb+48FjbBe" + chr(10)
  sPubKey += "0hseUdN5HpwvnH/DW8ZccGvk53I6Orq7hLCv1ZHtuOCokghz/ATrhyPq+QktMfXn" + chr(10)
  sPubKey += "RS4HrKGJTzxaCcU7OQIDAQAB" + chr(10)
  sPubKey += "-----END PUBLIC KEY-----"  + chr(10)
  
  // Conteudo a ser assinado
  varinfo( "sStr", sStr )
  
  // Hash MD5 gerado a partir desse conteudo
  cMD5 := Md5( sStr )
  varinfo( "cMD5", cMD5 )
  
  // Assinatura gerada a partir do Hash MD5 usando a chave privada
  sSign := PrivSignRSA( sPrivKey, cMD5, 1, "senhachaveprivada" )
  varinfo( "sSign", sSign )
  
  // Verificando a assinatura usando a chave pública
  If PrivVeryRSA( sPubKey, cMD5, 1, sSign )
    conout('Signature Check OK')
  Else
    conout('Signature Check FAILED')
  Endif
Return

Veja também