CryptoKey
The CryptoKey
class in the 4D language encapsulates an asymmetric encryption key pair.
Essa classe está disponível no "class store" de 4D
.
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 objeto CryptoKey\ |
.getPublicKey() : Text retorna a chave pública do objeto CryptoKey |
.sign (message : Text ; options : Object) : Text .sign (message : Blob ; options : Object) : Text assina a representação utf8 de uma string message ou Blob |
.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 *.verify**( message : Blob ; signature : Text ; options : Object) : Object verifica a assinatura base64 em relação à representação utf8 da message |
4D. CryptoKey.new()
História
Release | Mudanças |
---|---|
18 R4 | Adicionado |
4D.CryptoKey.new( settings : Object ) : 4D.CryptoKey
Parâmetro | Tipo | Descrição | |
---|---|---|---|
settings | Object | -> | Settings to generate or load a key pair |
Resultados | 4D.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. It allows to generate a new RSA or ECDSA key, or to load an existing key pair from a PEM definition.
parâmetros
Propriedade | Tipo | Descrição |
---|---|---|
type | text | Define o tipo de chave a ser criada: |
curve | text | Nome da curva ECDSA |
pem | text | Definição PEM de uma chave de cifrado a carregar |
size | integer | Tamanho da chave RSA em bits |
CryptoKey
O objeto CryptoKey
devolvido encapsula um par de chaves de cifrado. It is a shared object and can therefore be used by multiple 4D processes simultaneously.
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:
// Get message, public key & signature
$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()
// Create a key
$type:=New object("type";"PEM";"pem";$publicKey)
$key:=4D.CryptoKey.new($type)
// Verify signature
If ($key.verify($message;$signature;$type).success)
// The signature is valid
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
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.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
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.decrypt( message : Text ; options : Object ) : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
message | Text | -> | String de mensagens a ser decodificada usando options.encodingEncrypted e descriptografada. |
options | Object | -> | Opções de codificação |
Resultados | Object | <- | Estado |
A função .encrypt()
criptografa o parâmetro message usando a chave pública. O algoritmo utilizado depende do tipo da chave.
The key must be a RSA key, the algorithm is RSA-OAEP (see RFC 3447).
opções
Propriedade | Tipo | Descrição |
---|---|---|
hash | text | Algoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512". |
encodingEncrypted | text | Encoding used to convert the message parameter into the binary representation to decrypt. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64". |
encodingDecrypted | text | Codificaçã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.
Propriedade | Tipo | Descrição |
---|---|---|
success | boolean | True se a mensagem tiver sido decifrada com êxito |
resultado | text | Mensagem decifrado e decodificado utilizando options.encodingDecrypted |
errors | collection | Se 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
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.encrypt( message : Text ; options : Object ) : Text
Parâmetro | Tipo | Descrição | |
---|---|---|---|
message | Text | -> | String de mensagens a ser codificada utilizando options.encodingDecrypted e criptografada. |
options | Object | -> | Opções de decodificação |
Resultados | Text | <- | 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.
The key must be a RSA key, the algorithm is RSA-OAEP (see RFC 3447).
opções
Propriedade | Tipo | Descrição |
---|---|---|
hash | text | Algoritmo Digest a utilizar. Por exemplo: "SHA256", "SHA384", ou "SHA512". |
encodingEncrypted | text | Codificação utilizada para converter a mensagem binária criptografada na string resultante. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64". |
encodingDecrypted | text | Encoding used to convert the message parameter into the binary representation to encrypt. Pode ser "UTF-8", "Base64" ou "Base64URL". Por padrão é "UTF-8". |
Resultado
O valor devolvido é uma mensagem encriptada.
.getPrivateKey()
História
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.getPrivateKey() : Text
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Text | <- | Chave privada em formato PEM |
A função ’.getPrivateKey()retorna a chave privada 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 privada.
.getPublicKey()
História
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.getPublicKey() : Text
Parâmetro | Tipo | Descrição | |
---|---|---|---|
Resultados | Text | <- | 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
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.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
Release | Mudanças |
---|---|
20 R8 | Support of message as Blob |
18 R4 | Adicionado |
.sign (message : Text ; options : Object) : Text
.sign (message : Blob ; options : Object) : Text
Parâmetro | Tipo | Descrição | |
---|---|---|---|
message | Texto OU Blob | -> | Message to sign |
options | Object | -> | Opções de assinatura |
Resultados | Text | <- | Signature in Base64 or Base64URL representation, depending on "encoding" option |
A função .sign()
assina a representação utf8 de uma string message ou Blob usando as chaves do objeto CryptoKey
e as opções fornecidas. It returns its signature in base64 or base64URL format, depending on the value of the options.encoding
attribute you passed.
A CryptoKey
deve conter uma chave privada válida.
opções
Propriedade | Tipo | Descrição |
---|---|---|
hash | text | Algoritmo 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@ |
encodingEncrypted | text | Codificação utilizada para converter a mensagem binária criptografada na string resultante. Pode ser "Base64", ou "Base64URL". Por padrão é "Base64". |
pss | boolean | Utiliza Probabilistic Signature Scheme (PSS). Ignorado se a chave não for uma chave RSA. Passe true ao produzir um JWT para o algoritmo PS@ |
encoding | text | Representation to be used for result signature. Possible values are "Base64" or "Base64URL". Por padrão é "Base64". |
Resultado
A representação utf8 de mensagem.
.size
História
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.size : Integer
Definido somente para chaves RSA: o tamanho da chave em bits. .
.type
História
Release | Mudanças |
---|---|
18 R4 | Adicionado |
.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 Elliptic Curve Digital Signature Algorithm, 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
Release | Mudanças |
---|---|
20 R8 | Support of message as Blob |
18 R4 | Adicionado |
.verify( message : Text ; signature : Text ; options : Object) : Object
*.verify**( message : Blob ; signature : Text ; options : Object) : Object
Parâmetro | Tipo | Descrição | |
---|---|---|---|
message | Texto OU Blob | -> | Message that was used to produce the signature |
signature | Text | -> | Signature to verify, in Base64 or Base64URL representation, depending on options.encoding value |
options | Object | -> | Opções de assinatura |
Resultados | Object | <- | Estado da verificação |
A função .verify()
verifica a assinatura base64 em relação à representação utf8 da message usando as chaves do objeto CryptoKey
e as options fornecidas.
A CryptoKey
deve conter uma chave pública válida.
opções
Propriedade | Tipo | Descrição |
---|---|---|
hash | text | Algoritmo 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@ |
pss | boolean | Utiliza Probabilistic Signature Scheme (PSS). Ignorado se a chave não for uma chave RSA. Passa true ao verficar um JWT para o algoritmo PS@ |
encoding | text | Codificaçã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
.
Propriedade | Tipo | Descrição |
---|---|---|
success | boolean | True se a assinatura corresponder com a mensagem |
errors | collection | Se success for false , pode conter uma coleção de erros |