【问题标题】:How to use Encryption in SAP如何在 SAP 中使用加密
【发布时间】:2018-10-03 12:39:09
【问题描述】:

SAP 服务器能够加密和散列数据。但似乎没有合适的 API 可供调用。 SAP Note 1456433 谈到了CL_SEC_SXML_XENCRYPTION 类。基本加密的签名显然是面向 SSF 的,不适合基本的私钥加密/解密。我不想要/不需要信封和用户证书。只是私钥。

我在 GitHub AES library in ABAP 上找到了一个 AES 库,并对其进行了调整以适合我们。但这很慢。我想使用 SAP 的加密库。显然,这些库在那里,但找到适当公开的 API 似乎是个问题。

有人知道如何在 SAP 中使用基本加密吗?
在 SAP ABAP 堆栈中,使用 ABAP。 例如(使用 AES-CBC 128 的调用,带有 PKCS7 填充

只需要私钥和要加密的数据。例如:

public static method  encrypt_xstring  
 importing i_key  type xstring  
       i_data  type xstring  
       i_initialization_vector  type xstring optional  
       i_padding_standard  type char10 optional  
       i_encryption_mode  type char10 optional  
  exporting e_data  type xstring  

用例是使用私钥加密客户端上的数据并将数据发送到 SAP 系统。该源支持私钥和库,如 AES-CBC。 我们有加密的数据交换工作。 下一步是使用受支持且速度更快的库。

编辑:如果有人需要在abap中正确加密/解密 并且正在寻找答案。使用类 CL_SEC_SXML_WRITER。 CL_SEC_SXML_WRITER 正是我想要的 但是 SAP 没有正确地公开它。只对加密有用,不解密。

与外部库交互时。使用 PKCS7 填充和 SALT 的位置 或需要初始化向量。 SAP 提供 ENCRYPT_IV 但不提供 Decrypt_IV。为什么 ???? 因此,您不能使用该工具并保持合规。 :( 在没有 IV 的情况下使用 AES-CBC 是不安全的。 SAP 为什么要这样做?

ENCRYPT_IV 代替 ENCRYPT 但没有 DECRYPT_IV

提供添加填充但没有删除填充。好的滚动你自己的填充删除,没什么大不了的。它就像必须是另一个方向的另一个库。

所以我可以使用该工具加密但不能解密。 我的主要问题是快速解密从移动设备发送的字符串。 所以仍然需要使用旧的 ABAP 代码:(

【问题讨论】:

  • 数据在SAP系统内部是否需要加密?还是您想确保传输安全?
  • 我不太明白这个问题。 ABAP 在 SAP 系统上运行,而不是在客户端上运行。您是否希望加密 SAP 系统上的数据并将其发送到另一个 SAP 系统?也许这个问题与 Bryan 的问题相同,但我的印象是,如果您在用户空间 ABAP 中公开私钥,您不应该再期望该密钥是私有的。 ABAP 有一个安全存储和转发系统和 API,我建议您进一步了解 - help.sap.com/viewer/1a93b7a44ac146b5ad9b6fd95c1223cc/7.5.9/…
  • 是的,它用于 ABAP 堆栈。我看过 SSF 库。它们都假设文档、信封、证书等。它们不公开底层加密 API。至少我找不到它。
  • 好吧,那么我认为您将仅限于客户开发的和 OSS 库,就像您找到的那样。您可能还想查看从 ABAP 调用命令行程序的选项,这将允许您使用几乎任何您想要的东西。我仍然建议不要在安全存储或 SSF 框架之外的 ABAP 运行时中管理私钥。它不是为此目的而设计的。
  • 用户私钥已加密。 SAP 系统本身有一个用于加密用户私钥的私钥。当然,如果 SAP 正确地公开了功能,那么这一切都不是必需的

标签: encryption aes sap


【解决方案1】:

我有类似的要求,我找到了cl_sec_sxml_writer 类。请看下面的例子。请注意,作者需要XSTRING 参数,这就是我使用转换类的原因。

REPORT zged_aes.

DATA lv_message_string TYPE string.

" create message
DATA(lr_conv_sec) = cl_abap_conv_out_ce=>create( ).
lr_conv_sec->write( data = 'This is my secret' ).

" create key
DATA(lr_conv_key) = cl_abap_conv_out_ce=>create( ).
lr_conv_key->write( data = 'MySymmetricKey' ).

" encrypt using AES256
cl_sec_sxml_writer=>encrypt(
  EXPORTING
    plaintext =  lr_conv_sec->get_buffer( )
    key =        lr_conv_key->get_buffer( )
    algorithm =  cl_sec_sxml_writer=>co_aes256_algorithm_pem
  IMPORTING
    ciphertext = DATA(lv_message) ).

" decrypt message 
cl_sec_sxml_writer=>decrypt(
  EXPORTING
    ciphertext = lv_message
    key =        lr_conv_key->get_buffer( )
    algorithm =  cl_sec_sxml_writer=>co_aes256_algorithm_pem
  IMPORTING
    plaintext =  DATA(lv_message_decrypted) ).

" convert xstring to string for output
cl_abap_conv_in_ce=>create( input = lv_message_decrypted)->read( IMPORTING data = lv_message_string ).

" output secret message
WRITE lv_message_string.

我在 NetWeaver 7.50 SP 6 系统上对其进行了测试。

【讨论】:

  • 很高兴拿起 Ged。该类甚至具有 PKCS7_padding 方法。有些我准备好测试了
【解决方案2】:

我让 ENCRYPT_IV 方法与 CL_SEC_SXML_WRITER 类的方法 DECRYPT 一起工作。

这里需要注意的是,我没有通过使用类 cl_abap_conv_out_ce 生成对称密钥和 IV。

我已经通过 Java 实现测试获得了密钥和 IV。

我唯一需要的是将 Key 和 IV 创建为 XSTRING 并使用我的 Java 实现的 Hex 格式初始化它们(它们是字节格式。

因此,我首先将它们转换为十六进制并将这些值传递给 ABAP Xstring 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多