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

CryptoKey

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

Essa classe está disponível no "class store" de 4D.

Veja também

Para obter uma visão geral abrangente dessa classe, consulte a postagem do blog CryptoKey: criptografar, descriptografar, assinar e verificar!.

Resumo

4D.CryptoKey.new( settings : Object ) : 4D.CryptoKey
cria um novo objeto 4D.CryptoKey que encapsula um par de chaves de criptografia
.curve : Text
nome da curva normalizada da chave
.decrypt( message : Text ; options : Object ) : Object
descriptografa o parâmetro message usando a chave privada
.encrypt( message : Text ; options : Object ) : Text
criptografa o parâmetro message usando a chave pública
.getPrivateKey() : Text
retorna a chave privada do objetoCryptoKey\
.getPublicKey() : Text
retorna a chave pública do objeto CryptoKey
.sign (message : Text ; options : Object) : Text
assina a representação utf8 de uma string message
.size : Integer
o tamanho da chave em bits
.type : Text
do tipo de chave - "RSA", "ECDSA", "PEM"
.verify( message : Text ; signature : Text ; options : Object) : Object
verifies the base64 signature against the utf8 representation of message

4D. CryptoKey.new()

História
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 novo objeto 4D.CryptoKey que encapsula um par de chaves de criptografia, 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.

parâmetros

PropriedadeTipoDescrição
typetextDefine o tipo de chave a ser criada:
  • "RSA": gera um par de chaves RSA, usando .size como tamanho.
  • "ECDSA": gera um par de chaves Elliptic Curve Digital Signature Algorithm, usando .curve como curva. Note that ECDSA keys cannot be used for encryption but only for signature.
  • "PEM": loads a key pair definition in PEM format, using .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 e, portanto, pode ser utilizado por vários processos 4D simultaneamente.

    Exemplo 1

    Uma mensagem é assinada por uma chave privada e a assinatura é verificada pela chave pública correspondente. O código a seguir assina e verifica uma assinatura de mensagem simples.

    • 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ória
    ReleaseMudanças
    18 R4Adicionado

    .curve : Text

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

    .decrypt()

    História
    ReleaseMudanças
    18 R4Adicionado

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

    ParâmetroTipoDescrição
    messageText->String de mensagens a ser decodificada usando options.encodingEncrypted e descriptografada.
    optionsObject->Opções de codificação
    ResultadosObject<-Estado

    A função .encrypt() criptografa o parâmetro message usando a chave pública. O algoritmo utilizado depende do tipo da chave.

    A chave deve ser uma chave RSA, o algoritmo é RSA-OAEP (consulte RFC 3447).

    opções

    PropriedadeTipoDescrição
    hashtextAlgoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512".
    encodingEncryptedtextCodificação utilizada para converter o parâmetro message 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".

    Resultado

    A função retorna um objeto status com a propriedade success definida como true se a mensagem puder ser descriptografada com êxito.

    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

    Caso a mensagem não possa ser descriptografada porque não foi criptografada com a mesma chave ou algoritmo, o objeto status que está sendo retornado contém uma coleção de erros em status.errors.

    .encrypt()

    História
    ReleaseMudanças
    18 R4Adicionado

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

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

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

    A chave deve ser uma chave RSA, o algoritmo é RSA-OAEP (consulte RFC 3447).

    opções
    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 usada para converter o parâmetro message na representação binária a ser criptografada. Pode ser "UTF-8", "Base64" ou "Base64URL". Por padrão é "UTF-8".

    Resultado

    O valor devolvido é uma mensagem encriptada.

    .getPrivateKey()

    História
    ReleaseMudanças
    18 R4Adicionado

    .getPrivateKey() : Text

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

    A função ’.getPrivateKey()retorna a chave privada do objetoCryptoKey` no formato PEM ou uma cadeia de caracteres vazia se não houver nenhuma disponível.

    Resultado

    O valor devolvido é a chave privada.

    .getPublicKey()

    História
    ReleaseMudanças
    18 R4Adicionado

    .getPublicKey() : Text

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

    A função .getPublicKey() retorna a chave pública do objeto CryptoKey no formato PEM ou uma cadeia de caracteres vazia se não houver nenhuma disponível.

    Resultado

    O valor devolvido é a chave pública.


    .pem

    História
    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ória
    ReleaseMudanças
    18 R4Adicionado

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

    ParâmetroTipoDescrição
    messageText->String mensagem a assinar
    optionsObject->Opções de assinatura
    ResultadosText<-Assinatura na representação Base64 ou Base64URL, dependendo da opção "encoding"

    A função .sign() assina a representação utf8 de uma string message usando as chaves do objeto CryptoKey e as options fornecidas. Ele retorna sua assinatura no formato base64 ou base64URL dependendo do valor do atributo options.encoding que você passou.

    A CryptoKey deve conter uma chave privada válida.

    opções

    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. Passe true ao produzir um JWT para o algoritmo PS@
    encodingtextRepresentation of provided signature. Possible values are "Base64" or "Base64URL". Por padrão é "Base64".

    Resultado

    A representação utf8 da string message.

    .size

    História
    ReleaseMudanças
    18 R4Adicionado

    .size : Integer

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

    .type

    História
    ReleaseMudanças
    18 R4Adicionado

    .type : Text

    Contém o nome do tipo de 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ória
    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

    The .verify() function verifies the base64 signature against the utf8 representation of message using the CryptoKey object keys and provided options.

    A CryptoKey deve conter uma chave pública válida.

    opções

    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".

    Resultado

    The function returns a status object with success property set to true if message could be successfully verified (i.e. the signature matches).

    In case the signature couldn't be verified because it was not signed with the same message, key or algorithm, the status object being returned contains an error collection in status.errors.

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