SAP加密概述
目录
背景
在做项目时,要求数据安全的项目越来越多,因此sap和外围系统的交互以及本身数据的安全性等都需要考虑数据加密,这里简单介绍SAP中的一些数据加密实现形式。
简介
单向加密(消息摘要算法),主要为MD5,SHA1以及HMAC,基于哈希运算生成消息摘要,常用来验证数据完整性,密码校验,签名等。
对称加密,常见的为DES、3DES,AES,加解密速度较快,一般用作大数据量加密,比如接口数据。密钥管理安全性较低,属于双向加密。
非对称加密,一般使用两个密钥来进行加密和解密,常用算法RSA,ECC,Elgmal,背包算法,Rabin, D-H该类型加密加解密算法耗时长,适合小数据量加解密或数据签名。
其它如PGP加密等
实现
MD5/SHA1
SAP中MD5加密输出32位大写MD5 hash值,如下示例,类中其它方法可对文件流进行散列运算(可用作验证文件是否被篡改)。algorithm设置为'SHA1' 即为使用SHA1算法,SHA1比MD5安全性更高
DATA if_algorithm TYPE string.
DATA if_data TYPE string.
DATA if_length TYPE i.
DATA ef_hashstring TYPE string.
DATA ef_hashxstring TYPE xstring.
DATA ef_hashb64string TYPE string.
DATA ef_hashx TYPE xstring.
if_data = '123456'.
TRY.
cl_abap_message_digest=>calculate_hash_for_char(
EXPORTING
if_algorithm = 'MD5'
if_data = if_data
if_length = 0
IMPORTING
ef_hashstring = ef_hashstring
ef_hashxstring = ef_hashxstring
ef_hashb64string = ef_hashb64string
ef_hashx = ef_hashx
).
CATCH cx_abap_message_digest .
ENDTRY.
WRITE:/ ef_hashstring.
WRITE:/ ef_hashxstring.
WRITE:/ ef_hashb64string.
WRITE:/ ef_hashx.
如果系统没有上述方法,可以使用函数MD5_CALCULATE_HASH_FOR_CHAR或CALCULATE_HASH_FOR_CHAR。
HMAC
对比MD5和SHA1增加了密钥,算法可选MD5/SHA1等,示例如下
DATA if_algorithm TYPE string.
DATA if_key TYPE xstring.
DATA if_data TYPE string.
DATA if_length TYPE i.
DATA ef_hmacstring TYPE string.
DATA ef_hmacxstring TYPE xstring.
DATA ef_hmacb64string TYPE string.
if_data = '123456'.
if_key = '31'. " 字符对应16进制字符串
TRY.
cl_abap_hmac=>calculate_hmac_for_char(
EXPORTING
if_algorithm = 'SHA1' " 加密算法
if_key = if_key " 十六进制密钥
if_data = if_data
if_length = 0
IMPORTING
ef_hmacstring = ef_hmacstring
ef_hmacxstring = ef_hmacxstring
ef_hmacb64string = ef_hmacb64string
).
CATCH cx_abap_message_digest .
ENDTRY.
WRITE:/ ef_hmacstring.
WRITE:/ ef_hmacxstring.
WRITE:/ ef_hmacb64string.
如果系统没有上述方法,可以使用函数CALCULATE_HMAC_FOR_CHAR
DES/3DES/AES
DES 分组加密,以 64 位为分组对数据加密,密钥长度64位,其中56 位有效密钥和8位奇偶校验。
3DES 是基于 DES 的 对称算法,对 一块数据 用 三个不同的密钥 进行 三次DES加密,强度更高,由于3DES加密是使用三组密钥分别对前一步数据进行DES加密,解密,加密操作,因此如果三组密钥相同,则相当于DES加密。
AES 采用 对称分组密码体制,密钥长度支持 128 位、 192 位、256 位,分组长度 128 位,具有更高安全性。是下一代的加密算法标准,速度快,安全级别高。
DES加密暂无资源,3DES加密的实现有根据算法原理使用ABAP复现加密的资源,参考博客
3DES对称加密算法(ABAP 语言实现版) - 江正军 - 博客园
标准类cl_sec_sxml_writer中有3DES(TripleDES)加密,AES加密的方法,可参考博客file-encryption-and-decryption,其中加密模式CBC,填充模式未知,偏移量参数也未知。另外AES加密git地址 :ABAP-AES-git
;由于部分在线3DES加密输出的base64串中带salt,两种加密方式均未在线验证成功。标准方法3DES加密示例如下
DATA: lv_data TYPE string,
lv_data_xstr TYPE xstring,
lv_key_xstr TYPE xstring,
lv_key_str TYPE string,
lv_en_xstr TYPE xstring,
lv_de_xstr TYPE xstring,
lv_de_str TYPE string,
lv_en_str TYPE string.
lv_data = '1234'.
lv_data_xstr = cl_bcs_convert=>string_to_xstring( iv_string = lv_data iv_codepage = '4110' ).
lv_key_xstr = cl_sec_sxml_writer=>generate_key( algorithm = cl_sec_sxml_writer=>co_tdes_algorithm ).
WRITE: / lv_data_xstr.
WRITE: / lv_key_xstr.
WRITE: / lv_key_str.
TRY.
cl_sec_sxml_writer=>encrypt(
EXPORTING
plaintext = lv_data_xstr
key = lv_key_xstr
algorithm = cl_sec_sxml_writer=>co_tdes_algorithm
IMPORTING
ciphertext = lv_en_xstr ).
CATCH cx_root.
ENDTRY.
TRY.
cl_sec_sxml_writer=>decrypt(
EXPORTING
ciphertext = lv_en_xstr
key = lv_key_xstr
algorithm = cl_sec_sxml_writer=>co_tdes_algorithm
IMPORTING
plaintext = lv_de_xstr
).
CATCH cx_root.
ENDTRY.
lv_de_str = cl_bcs_convert=>xstring_to_string( iv_xstr = lv_de_xstr iv_cp = '4110' ).
WRITE: / lv_de_xstr.
WRITE: / lv_de_str.
PS:基于3DES加密和DES加密的原理,理论上3DES加密能够实现,DES加密也可以实现
RSA
RSA加密算法为目前最有影响力的公钥加密算法,ABAP中有两种实现方式,一种是基于算法原理的ABAP版本的加密实现,另一种直接上传密钥文件,使用函数SSFW_KRN_ENVELOPE加密,函数SSFW_KRN_SIGN生成签名。
参考博客:RSA加解密
以上两种形式的RSA加解密均已验证且可以在和外部系统对接中使用,只是需要注意PKCS版本。
其中基于加密原理实现的方法看起来比较吃力,感兴趣的可以了解下相关知识,链接附后;这里简单说明下密钥,公钥私钥实际上是基于数学原理产生的整数对,根据DER编码规则生成对应的十六进制数据,最后对十六进制数据base64处理。
PKCS规范自行查找
标准函数的使用参考函数组中的单元测试类扩展使用方法。由于效率问题,相对来说建议使用SM69命令来实现RSA的加密,而不是ABAP版本的RSA加解密。
PGP
采用公开密钥加密与传统密钥加密相结合的一种加密技术,无标准方法,GIT代码有PGP-git
博客https://blogs.sap.com/2020/05/01/using-pgp-encryption-in-abap-program/中提到了标准webservice解决,需要PI/PO平台或者cloud版本才能支持,实际使用时为SM69命令结合脚本。
其它
BASE64 在sap系统中比较广泛,标准api很多,有方法cl_http_utility=>if_http_utility~encode_base64,cl_http_utility=>if_http_utility~decode_base64;function scms_base64_encode_str ,scms_base64_decode_str等。
CRC32 循环冗余校验,验证数据正确性 方法cl_abap_zip=>crc32
urlEncode 方法cl_http_utility=>if_http_utility~escape_url或escape( val = iv_urlstring format = cl_abap_format=>e_uri_full ).
hard wired 加密
DATA: lo_encryptor TYPE REF TO cl_hard_wired_encryptor,
string TYPE string,
string_en TYPE string,
string_de TYPE string.
CREATE OBJECT lo_encryptor.
string = '123456'.
TRY.
string_en = lo_encryptor->encrypt_string2string( string ).
CATCH cx_encrypt_error.
ENDTRY.
WRITE:/ string_en.
TRY.
string_de = lo_encryptor->decrypt_string2string( string_en ).
CATCH cx_encrypt_error.
ENDTRY.
WRITE:/ string_de.
其它使用的xstring,string的转换类如cl_bcs_convert
文章来自于网络,如果侵犯了您的权益,请联系站长删除!