Saltar para o conteúdo principal
Versão: 20

CryptoKey

A classe CryptoKey da linguagem 4D contém um par de chaves de cifrado assimétrico.

Esta classe está disponível na loja de classes de 4D.

Ver também

Para obter uma apresentação completa dessa classe, recomendamos que você leia a postagem do blog CryptoKey: criptografar, descriptografar, assinar e verificar!.

Resumo

4D.CryptoKey.new( settings : Object ) : 4D.CryptoKey
cria um objeto 4D.CryptoKey que encapsula um par de chaves de encriptação
.curve : Text
nome da curva normalizada da chave
.decrypt( message : Text ; options : Object ) : Object
decifra o parâmetro mensagem usando a chave privada
.encrypt( message : Text ; options : Object ) : Text
encripta o parâmetro mensagem utilizando a chave public
.getPrivateKey() : Text
devolve a chave privada do objecto CryptoKey
.getPublicKey() : Text
devolve a chave pública do objecto CryptoKey
.sign (message : Text ; options : Object) : Text
assina a representação utf8 de uma mensagem ** string
.size : Integer
o tamanho da chave em bits
.type : Text
nome do tipo da chave - "RSA", "ECDSA", "PEM"
.verify( message : Text ; signature : Text ; options : Object) : Object
verifica a assinatura base64 contra a representação utf8 de mensagem

4D. CryptoKey.new()

Histórico
ReleaseMudanças
18 R4Adicionado

4D.CryptoKey.new( settings : Object ) : 4D.CryptoKey

ParâmetroTipoDescrição
settingsObject->Parâmetros para gerar ou carregar um par de chaves
Resultados4D.CryptoKey<-Objeto que contém um par de chaves de encriptação

A função 4D.CryptoKey.new() cria um objeto 4D.CryptoKey que encapsula um par de chaves de encriptação, com base no parâmetro objeto settings. Permite gerar uma nova chave RSA o ECDSA, ou carregar um par de chaves existente desde uma definição PEM.

settings

PropriedadeTipoDescrição
typetextDefine o tipo da chave a criar:
  • "RSA": gera um par de chaves RSA usando .size como size.
  • "ECDSA": gera um par de chaves Elliptic Curve Digital Signature Algorithm, usando .curve como curve. Lembre que chaves ECDSA não podem ser usadas para a criptografia mas só pela assinatura.
  • "PEM": carrega uma definição de par de chaves em formato PEM, usando .pem.
  • curvetextNome da curva ECDSA
    pemtextDefinição PEM de uma chave de cifrado a carregar
    sizeintegerTamanho da chave RSA em bits

    CryptoKey

    O objeto CryptoKey devolvido encapsula um par de chaves de cifrado. É um objeto compartido, portanto, pode ser utilizado por vários processos 4D simultaneamente.

    Exemplo 1

    A message is signed by a private key and the signature is verified by the corresponding public key. The following code signs and verifies a simple message signature.

    • Lado bob:
    // Criar a mensagem
    $message:="hello world"
    Folder(fk desktop folder).file("message.txt").setText($message)

    // Criar uma chave
    $type:=New object("type"; "RSA")
    $key:=4D.CryptoKey.new($type)

    // Obtenha a chave pública e salve-a
    Folder(fk desktop folder).file("public.pem").setText($key.getPublicKey())

    // Obtenha a assinatura como base64 e salve-a
    Folder(fk desktop folder).file("signature").setText($key.sign($message;$type))

    /*Bob envia a mensagem, a chave pública e a assinatura para Alice*/
    • O lado Alice:
    // Obter mensagem, chave pública e assinatura
    $message:=Folder(fk desktop folder).file("message.txt").getText()
    $publicKey:=Folder(fk desktop folder).file("public.pem").getText()
    $signature:=Folder(fk desktop folder).file("signature").getText()

    // Criar uma chave
    $type:=New object("type"; "PEM"; "pem";$publicKey)
    $key:=4D.CryptoKey.new($type)

    // Verificar assinatura
    If ($key.verify($message;$signature;$type).success)
    // A assinatura é válida

    End if

    Exemplo 2

    O código abaixo de exemplo firma e verifica uma mensagem utilizando um novo par de chaves ECDSA, por exemplo para criar um token web JSON ES256.

     // Generate a new ECDSA key pair
    $key:=4D. CryptoKey.new(New object("type";"ECDSA";"curve";"prime256v1"))

    // Get signature as base64
    $message:="hello world"
    $signature:=$key.sign($message;New object("hash";"SHA256"))

    // Verify signature
    $status:=$key.verify($message;$signature;New object("hash";"SHA256"))
    ASSERT($status.success)

    .curve

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .curve : Text

    Definido apenas para as chaves ECDSA: o nome da curva normalizada da chave. Normalmente "prime256v1" para ES256 (por defeito), "secp384r1" para ES384, "secp521r1" para ES512.

    .decrypt()

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .decrypt( message : Text ; options : Object ) : Object

    ParâmetroTipoDescrição
    messageText->String de mensagens a decodificar utilizando options.encodingEncrypted e descifrar.
    optionsObject->Opções de codificação
    ResultadosObject<-Estado

    A função .decrypt() decifra o parâmetro mensagem usando a chave privada. O algoritmo utilizado depende do tipo da chave.

    "RSA": um par de chaves RSA, utilizando settings.size como [.size](#size).

    options

    PropriedadeTipoDescrição
    hashtextAlgoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512".
    encodingEncryptedtextCodificação utilizada para converter o parâmetro mensagem na representação binaria a decifrar. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64".
    encodingDecryptedtextCodificação utilizada para converter a mensagem binário decifrado na string de resultados. Pode ser "UTF-8", "Base64" ou "Base64URL". Por padrão é "UTF-8".

    Resultados

    CryptoKey deve conter uma chave válida publica.

    PropriedadeTipoDescrição
    successbooleanTrue se a mensagem tiver sido decifrada com êxito
    resultadotextMensagem decifrado e decodificado utilizando options.encodingDecrypted
    errorscollectionSe success for false, pode conter uma coleção de erros

    A função devolve um objeto "status" com a propriedade success definida como true se message puder ser descifrada com êxito.

    .encrypt()

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .encrypt( message : Text ; options : Object ) : Text

    ParâmetroTipoDescrição
    messageText->String de mensagens a codificar utilizando options.encodingDecrypted e encriptar
    optionsObject->Opções de decodificação
    ResultadosText<-Mensagem criptografada e codificada utilizando options.encodingEncrypted

    A função .encrypt() encripta o parâmetro mensagem utilizando a chave public. O algoritmo utilizado depende do tipo da chave.

    "RSA": um par de chaves RSA, utilizando settings.size como [.size](#size).

    options
    PropriedadeTipoDescrição
    hashtextAlgoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512".
    encodingEncryptedtextCodificação utilizada para converter a mensagem binária criptografada na string resultante. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64".
    encodingDecryptedtextCodificação utilizada para converter a mensagem binária criptografada na string resultante. Pode ser "UTF-8", "Base64" ou "Base64URL". Por padrão é "UTF-8".

    Resultados

    O valor devolvido é uma mensagem encriptada.

    .getPrivateKey()

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .getPrivateKey() : Text

    ParâmetroTipoDescrição
    ResultadosText<-Chave privada em formato PEM

    A função .getPrivateKey() devolve a chave privada do objecto CryptoKey em formato PEM, ou uma string vazia se nenhum estiver disponível.

    Resultados

    O valor devolvido é a chave privada.

    .getPublicKey()

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .getPublicKey() : Text

    ParâmetroTipoDescrição
    ResultadosText<-Chave pública em formato PEM

    A função .getPublicKey() devolve a chave pública do objecto CryptoKey em formato PEM, ou uma string vazia se nenhum estiver disponível.

    Resultados

    O valor devolvido é a chave pública.


    .pem

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .pem : Text

    Definição PEM de uma chave de cifrado a carregar. Se a chave for uma chave privada, será deduzido dela a chave pública RSA ou ECDSA.

    .sign()

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .sign (message : Text ; options : Object) : Text

    ParâmetroTipoDescrição
    messageText->String mensagem a assinar
    optionsObject->Opções de assinatura
    ResultadosText<-Signature in Base64 or Base64URL representation, depending on "encoding" option

    A função .sign() assina a representação utf8 de uma mensagem ** string utilizando o CryptoKey chaves-objecto e forneceu opções. Devolve a sua assinatura no formato base64 ou base64URL, dependendo do valor do atributo options.encoding que passou.

    CryptoKey deve conter uma chave válida privada.

    options

    PropriedadeTipoDescrição
    hashtextAlgoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512". Quando utilizar para produzir um JWT, o tamanho de hash deve coincidir com o tamanho do algoritmo PS@, ES@, RS@ ou PS@
    encodingEncryptedtextCodificação utilizada para converter a mensagem binária criptografada na string resultante. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64".
    pssbooleanUtiliza Probabilistic Signature Scheme (PSS). Ignorado se a chave não for uma chave RSA. Passa true ao produzir um JWT para o algoritmo PS@
    encodingtextRepresentation of provided signature. Possible values are "Base64" or "Base64URL". Por padrão é "Base64".

    Resultados

    CryptoKey deve conter uma chave válida privada.

    .size

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .size : Integer

    Definido apenas para chaves RSA: o tamanho da chave em bits. .

    .type

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .type : Text

    Contém nome do tipo da chave - "RSA", "ECDSA", "PEM" .

    • "RSA": um par de chaves RSA, usando settings.size como .size.
    • "ECDSA": um par de chaves de Algoritmos de Assinatura Digital de Curva Elíptica, usando settings.curve como .curve. Lembre que chaves ECDSA não podem ser usadas para a criptografia mas só pela assinatura.
    • "PEM": uma definição de par chave em formato PEM, usando settings.pem como .pem.

    .verify()

    Histórico
    ReleaseMudanças
    18 R4Adicionado

    .verify( message : Text ; signature : Text ; options : Object) : Object

    ParâmetroTipoDescrição
    messageText->String de mensagem utilizada para gerar a assinatura
    signatureText->Assinatura que vai ser verificada, em representação Base64 ou Base64URL, dependendo do valor de options.encoding
    optionsObject->Opções de assinatura
    ResultadosObject<-Estado da verificação

    A função .verify() verifica a assinatura base64 contra a representação utf8 de mensagem utilizando o CryptoKey chaves-objecto e forneceu opções.

    CryptoKey deve conter uma chave válida publica.

    options

    PropriedadeTipoDescrição
    hashtextAlgoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512". Quando utilizar para produzir um JWT, o tamanho de hash deve coincidir com o tamanho do algoritmo PS@, ES@, RS@ ou PS@
    pssbooleanUtiliza Probabilistic Signature Scheme (PSS). Ignorado se a chave não for uma chave RSA. Passa true ao verficar um JWT para o algoritmo PS@
    encodingtextCodificação utilizada para converter a mensagem binária criptografada na string resultante. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64".

    Resultados

    A função devolve um objeto "status" com a propriedade successestabelecida para true se message puder ser verificada com êxito (ou seja, se a assinatura coincidir).

    Se a assinatura não puder ser verificada por não ter sido assinada com a mesma message, chave ou algoritmo, o objecto status devolvido contém uma colecção de erros em status.errors.

    PropriedadeTipoDescrição
    successbooleanTrue se a assinatura corresponder com a mensagem
    errorscollectionSe success for false, pode conter uma coleção de erros