文章
· 五月 15, 2022 阅读大约需 7 分钟

InterSystems 最佳实践之 掌握 %SYSTEM.Encryption 加密类

InterSystems IRIS对加密、解密和哈希操作有很好的支持。在%SYSTEM.Encryption(https://docs.intersystems.com/iris20212/csp/documatic/%25CSP.Documatic.c...)类中,有市场上主要算法的类方法。


IRIS算法和加密/解密类型

正如你所看到的,这些操作是基于密钥的,包括3个类:

  • 对称密钥: 进行加密和解密操作的部分共享同一个秘密密钥。
  • 非对称密钥: 进行加密和解密操作的部分共享相同的秘密密钥进行加密。然而,对于解密,每个部分都有一个私人密钥。这个密钥不能与其他人共享,因为它是一个身份证明。
  • 哈希: 当你不需要解密,而只需要加密时使用。当涉及到存储用户密码时,这是一种常见的方法。

对称和非对称加密的区别

  • 对称加密使用一个单一的密钥,需要在需要接收信息的人之间共享,而非对称加密在通信时使用一对公共密钥和一个私人密钥来加密和解密信息。
  • 对称加密是比较老的技术,而非对称加密则相对较新。
  • 非对称加密的出现是为了补充对称加密模式中需要共享密钥的固有问题,通过使用一对公共-私有密钥来消除共享密钥的需要。
  • 非对称加密比对称加密花费的时间相对较多。

 

主要区别

对称加密

非对称加密

密码文本大小

比原始纯文本文件更小的密码文本

比原始纯文本文件更大的密码文本

数据量

用于传输大数据.

用于传输小数据.

资源消耗

较低.

较高

密钥长度

128 或 256 位

RSA 2048位或者更长.

安全性

由于使用单一密钥进行加密,安全性较低。

由于在加密和解密中涉及两个不同的密钥,因此要安全得多。

密钥数量

加密和解密用单一密钥

加密和解密使用两个不同的密钥

技术

较老.

较新.

保密性

单一密钥,有可能被破解.

两个密钥分别用于加密和解密,从而消除了共享密钥的需要.

速度

较快

较慢.

算法

RC4, AES, DES, 3DES, QUAD.

RSA, Diffie-Hellman, ECC .

来源: https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences 

使用 %SYSTEM.Encryption 类来实现加密、解密与哈希


要行使IRIS对加密、解密和哈希操作的支持,请访问https://github.com/yurimarx/cryptography-samples,并遵循以下步骤:

1. Clone/git 将 repo 拉入任何本地目录

$ git clone https://github.com/yurimarx/cryptography-samples.git

2. 在目录中打开 Docker 终端并执行:

$ docker-compose build

3. 启动 IRIS 容器:

$ docker-compose up -d

4. 打开 IRIS 终端:

$ docker-compose exec iris iris session iris -U IRISAPP

IRISAPP>

5.  实现非对称RSA 加密:

IRISAPP>Set ciphertext = ##class(dc.cryptosamples.Samples).DoRSAEncrypt("InterSystems")
IRISAPP>Write ciphertext
Ms/eR7pPmE39KBJu75EOYIxpFEd7qqoji61EfahJE1r9mGZX1NYuw5i2cPS5YwE3Aw6vPAeiEKXF
rYW++WtzMeRIRdCMbLG9PrCHD3iQHfZobBnuzx/JMXVc6a4TssbY9gk7qJ5BmlqRTU8zNJiiVmd8
pCFpJgwKzKkNrIgaQn48EgnwblmVkxSFnF2jwXpBt/naNudBguFUBthef2wfULl4uY00aZzHHNxA
bi15mzTdlSJu1vRtCQaEahng9ug7BZ6dyWCHOv74O/L5NEHI+jU+kHQeF2DJneE2yWNESzqhSECa
ZbRjjxNxiRn/HVAKyZdAjkGQVKUkyG8vjnc3Jw==

6. 实现非对称 RSA 解密:

IRISAPP>Set plaintext = ##class(dc.cryptosamples.Samples).DoRSADecrypt(ciphertext)
IRISAPP>Write plaintext
InterSystems

7. 实现对称 AES CBC 加密:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCEncrypt("InterSystems")
8sGVUikDZaJF+Z9UljFVAA==

8. 实现对称AES CBC 解密:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoAESCBCDecrypt("8sGVUikDZaJF+Z9UljFVAA==")
InterSystems

9. 实现MD5 哈希:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoHash("InterSystems")
rOs6HXfrnbEY5+JBdUJ8hw==

10. 实现SHA 推荐哈希:

IRISAPP>Do ##class(dc.cryptosamples.Samples).DoSHAHash("InterSystems")
+X0hDlyoViPlWOm/825KvN3rRKB5cTU5EQTDLvPWM+E=

11. 退出终端:

Enter HALT or H (大小写不敏感)

 

关于源代码

1. 关于对称密钥

# to use with symmetric encrypt/decrypt
ENV SECRETKEY=InterSystemsIRIS

在Dockerfile创建了一个环境密钥,作为对称操作的秘钥。

 

2. 关于非对称密钥

# to use with asymmetric encrypt/decrypt
RUN openssl req  -new -x509 -sha256 -config example-com.conf -newkey rsa:2048 -nodes -keyout example-com.key.pem  -days 365 -out example-com.cert.pem

在Dockerfile创建了一个公钥和一个私钥用作非对称操作

 

3. 对称加密

// Symmetric Keys sample to encrypt
 
ClassMethod DoAESCBCEncrypt(plaintext As %String) As %Status
{
    // convert to utf-8
    Set text=$ZCONVERT(plaintext,"O","UTF8")
   
    // set a secret key
    Set secretkey = $system.Util.GetEnviron("SECRETKEY")
    Set IV = $system.Util.GetEnviron("SECRETKEY")
   
    // encrypt a text
    Set text = $SYSTEM.Encryption.AESCBCEncrypt(text, secretkey, IV)
    Set ciphertext = $SYSTEM.Encryption.Base64Encode(text)
   
    Write ciphertext
}

AES CBC 加密主要用于加密文本。
Base64编码将结果作为一个可读的文本返回给用户。.

 

4. 对称解密

// Symmetric Keys sample to decrypt
 
ClassMethod DoAESCBCDecrypt(ciphertext As %String) As %Status
{
    // set a secret key
    Set secretkey = $system.Util.GetEnviron("SECRETKEY")
    Set IV = $system.Util.GetEnviron("SECRETKEY")
   
    // decrypt a text
    Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
    Set text=$SYSTEM.Encryption.AESCBCDecrypt(text,secretkey,IV)
   
    Set plaintext=$ZCONVERT(text,"I","UTF8")
    Write plaintext
}

AES CBC 解密用于解密文本.
Base64解码将加密后的文本返回为二进制文本,可以用来解密。

 

5. 非对称加密

// Asymmetric Keys sample to encrypt
 
ClassMethod DoRSAEncrypt(plaintext As %String) As %Status
{
    // get public certificate
    Set pubKeyFileName = "/opt/irisbuild/example-com.cert.pem"
    Set objCharFile = ##class(%Stream.FileCharacter).%New()
    Set objCharFile.Filename = pubKeyFileName
    Set pubKey = objCharFile.Read()
 
    // encrypt using RSA
    Set binarytext = $System.Encryption.RSAEncrypt(plaintext, pubKey)
    Set ciphertext = $SYSTEM.Encryption.Base64Encode(binarytext)
   
    Return ciphertext
}

必须获得公钥文件内容,用RSA进行加密。
RSA加密是用来加密文本的。

 

6. 非对称解密

// Asymmetric Keys sample to decrypt
 
ClassMethod DoRSADecrypt(ciphertext As %String) As %Status
{
    // get private key
    Set privKeyFileName = "/opt/irisbuild/example-com.key.pem"
    Set privobjCharFile = ##class(%Stream.FileCharacter).%New()
    Set privobjCharFile.Filename = privKeyFileName
    Set privKey = privobjCharFile.Read()
 
    // get ciphertext in binary format
    Set text=$SYSTEM.Encryption.Base64Decode(ciphertext)
 
    // decrypt text using RSA
    Set plaintext = $System.Encryption.RSADecrypt(text, privKey)
 
    Return plaintext
}

要想用RSA解密,必须得到私钥文件内容。
RSA解密的操作来解密文本。

 

7. 使用MD5的哈希文本(老方法)

// Hash sample
 
ClassMethod DoHash(plaintext As %String) As %Status
{
    // convert to utf-8
    Set text=$ZCONVERT(plaintext,"O","UTF8")
   
    // hash a text
    Set hashtext = $SYSTEM.Encryption.MD5Hash(text)
   
    Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
 
    // convert to hex text to following best practices
    Set hextext = ..GetHexText(base64text)
 
    // return using lowercase
    Write $ZCONVERT(hextext,"L")
}

MD5 哈希加密文本,并且不能被解密Hash will encrypt the text, and it will not be possible to decrypt it.
新项目不建议使用MD5的哈希值,因为它被认为是不安全的。这就是为什么它被SHA所取代。InterSystems的IRIS支持SHA(我们的下一个例子将演示它)。

 

8. 使用SHA的Hash文本 (推荐)

我们将在这个样本中使用SHA-3哈希方法。根据InterSystems公司的文档,该方法使用美国安全哈希算法-3之一生成哈希值((更多信息见联邦信息处理标准出版物202)。   

// Hash using SHA
 
ClassMethod DoSHAHash(plaintext As %String) As %Status
{
    // convert to utf-8
    Set text=$ZCONVERT(plaintext,"O","UTF8")
   
    // hash a text
    Set hashtext = $SYSTEM.Encryption.SHA3Hash(256, text)
   
    Set base64text = $SYSTEM.Encryption.Base64Encode(hashtext)
 
    // convert to hex text to following best practices
    Set hextext = ..GetHexText(base64text)
 
    // return using lowercase
    Write $ZCONVERT(hextext,"L")
}

对于SHA方法,可以设置哈希操作中使用的比特长度。位数越多,破解哈希就越困难。然而,哈希过程也会变慢。在这个例子中,我们使用了256位。你可以选择以下长度:

  • 224 (SHA-224)
  • 256 (SHA-256)
  • 384 (SHA-384)
  • 512 (SHA-512)
讨论 (0)1
登录或注册以继续