• Inicio
  • Novedades
  • Academia SAP
  • FAQ
  • Blog
  • Contacto
S4PCADEMY_Logo
Twitter Linkedin Instagram
S4PCADEMY_Logo
Twitter Linkedin Instagram
FORMACIÓN SAP

Lógica de cifrado para archivos de pago.

By s4pcademy 


Este blog está escrito principalmente para ayudar si está buscando lógica de cifrado en SAP.

Hay 2 formas de encriptación:

i) PGP: esto necesitaría el paquete PGP instalado en SAP (Esto no está cubierto en este blog.)

ii) AES: código abierto y se puede realizar mediante la ejecución de comandos a nivel de servidor.

Este blog está tratando de abordar el escenario del archivo de pago (F110). Los archivos de pago generados deben cifrarse y CPI o un tercero deben haberlos descifrado (según el escenario).

Puede haber varios escenarios, por ejemplo, si estamos haciendo AES desde SAP y un tercero no acepta AES, entonces CPI tiene que descifrar y cifrar nuevamente en PGP y enviarlo a un tercero.

En cualquier caso, tenemos que asegurarnos de que la clave que estamos utilizando sea accesible a terceros y sean capaces de descifrar el archivo.

Captura de pantalla%20de%20fin%20a%20funcionalidad

Captura de pantalla del final de la funcionalidad

  • Generar clave AES y clave IV :
  1. Podemos hacer esto escribiendo un pequeño programa de prueba en SE38 como se muestra a continuación:
  2. En lt_result, obtendrá las claves Keys y IV. Puede hacer un bucle e imprimir.
DATA: lt_result  TYPE TABLE OF char1024
      .
DATA(lv_str) = 'openssl enc -aes-256-cbc -k secret -P -md sha1' .

CALL 'SYSTEM' ID 'COMMAND' FIELD lv_str
              ID 'TAB'     FIELD lt_result[]
  • Cree una tabla para guardar tanto la clave como la clave IV (No se recomienda guardar una clave si tiene un mejor enfoque, siga).

Tabla%20estructura

Estructura de la mesa

  • Cree un FM personalizado copiando el FM de prueba estándar (FI_PAYMEDIUM_SAMPLE_41) proporcionado por SAP. Esto traerá parámetros estándar y luego copiará y pegará debajo de la lógica.
  • La lógica se explica en el código, pero en un nivel alto esta lógica intenta ejecutar comandos a nivel de servidor para generar un archivo cifrado (.aes) y eliminar el archivo generado existente y colocar el cifrado en la ruta AL11.
  • Esta lógica también se puede usar para cifrar cualquier otro archivo y no específicamente archivos de pago con algunos cambios en la lógica.
  DATA: lv_fieldname      TYPE regut-fsnam      VALUE '(SAPLFPAYM10)GC_DME_FNAME',
        lv_flag_out       TYPE regut-fsnam      VALUE '(SAPFPAYM)PAR_XFIL',
        lv_path_org       TYPE regut-fsnam,
        lv_path_encrypted TYPE regut-fsnam,
        lv_cmd            TYPE char1024,
        lt_result2        TYPE TABLE OF char1024,
        gc_cr(1)          TYPE c,          "Carriage return code
        gc_lf(1)          TYPE c,          "Line feed code
        gc_eof(1)         TYPE c,          "End of line code..
        i_no_end_of_line  VALUE 'X',
        lv_key            TYPE zaes_key,
        lv_iv             TYPE zaes_iv,
        lv_keystr(200)    TYPE c,
        ls_string         TYPE string.
  FIELD-SYMBOLS: <fs_fieldname> TYPE any,
                 <fs_flag_out>  TYPE any.

  ASSIGN (lv_flag_out) TO <fs_flag_out>.

  IF  <fs_flag_out> EQ abap_true.

*Assign Standard file Name to Field Symbol
    ASSIGN (lv_fieldname) TO <fs_fieldname>.
    IF sy-subrc = 0.
      lv_path_org = <fs_fieldname> .
      CONCATENATE lv_path_org
                  TEXT-004
      INTO lv_path_encrypted.
    ENDIF.


    CLEAR ls_string.
*Append structure data to the existing file
*    OPEN DATASET lv_path_org FOR APPENDING IN LEGACY BINARY MODE.
*    IF sy-subrc = 0.
    CALL FUNCTION 'FI_DME_CHARACTERS'
      IMPORTING
        e_cr  = gc_cr
        e_lf  = gc_lf
        e_eof = gc_eof.
    LOOP AT t_file_output INTO DATA(ls_lines).
      IF ls_lines-length > 0.
        CLEAR ls_string.
        CONCATENATE ls_string ls_lines-line(ls_lines-length) INTO ls_string
                    RESPECTING BLANKS.
        IF i_no_end_of_line IS INITIAL.
          TRANSFER ls_string TO lv_path_org.
        ELSE.
          TRANSFER ls_string TO lv_path_org NO END OF LINE.
        ENDIF.
        IF sy-subrc NE 0.
          MESSAGE a229(bfibl02).
        ENDIF.
      ENDIF.
      IF NOT ls_lines-x_cr IS INITIAL.
        IF i_no_end_of_line IS INITIAL.
          TRANSFER gc_cr TO lv_path_org.
        ELSE.
          TRANSFER gc_cr TO lv_path_org NO END OF LINE.
        ENDIF.
        IF sy-subrc NE 0.
          MESSAGE a229(bfibl02).
        ENDIF.
      ENDIF.
      IF NOT ls_lines-x_lf IS INITIAL.
        IF i_no_end_of_line IS INITIAL.
          TRANSFER gc_lf TO lv_path_org.
        ELSE.
          TRANSFER gc_lf TO lv_path_org NO END OF LINE.
        ENDIF.
        IF sy-subrc NE 0.
          MESSAGE a229(bfibl02).
        ENDIF.
      ENDIF.
      IF NOT ls_lines-x_eof IS INITIAL.
        IF i_no_end_of_line IS INITIAL.
          TRANSFER gc_eof TO lv_path_org.
        ELSE.
          TRANSFER gc_eof TO lv_path_org NO END OF LINE.
        ENDIF.
        IF sy-subrc NE 0.
          MESSAGE a229(bfibl02).
        ENDIF.
      ENDIF.
*        ENdif
      CLEAR ls_lines.
    ENDLOOP.
*    ENDIF.

    CLOSE DATASET lv_path_org.

* Give 777 permission to the original file
    CONCATENATE TEXT-001
                lv_path_org
                INTO   lv_cmd SEPARATED BY space.

*  Command is executed
    CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd
                  ID 'TAB'     FIELD lt_result2[].

    CLEAR: lv_cmd, lt_result2.

    SELECT SINGLE aes_key iv_key INTO (lv_key,lv_iv ) FROM zr2r_t_encrypt
                                                        WHERE prog_name="ZR2R_I_002_PAYMEDIUM_41"
      .
    IF sy-subrc <> 0.
* Implement suitable error handling here
    ELSE.
      CONCATENATE '-K' lv_key
         '-iv' lv_iv
         INTO lv_keystr SEPARATED BY space.

* Aes 256 encryption
      CONCATENATE  TEXT-002
                   lv_path_org
                   '-out'
                   lv_path_encrypted
                   lv_keystr
                   INTO   lv_cmd SEPARATED BY space.

*   Command is executed
      CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd
                    ID 'TAB'     FIELD lt_result2[].

* 777 Permission given to the encrypted file
      CLEAR: lv_cmd, lt_result2.

      CONCATENATE TEXT-001
                  lv_path_encrypted
                  INTO   lv_cmd SEPARATED BY space.

*   Command is executed
      CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd
                    ID 'TAB'     FIELD lt_result2[].

    ENDIF.
    CLEAR:  t_file_output.
    REFRESH: t_file_output.
    FREE: t_file_output.

* Delete the Original file
    DELETE DATASET lv_path_org.
  ENDIF.

  • Ir a la transacción OBPM3-> Seleccionar medio de pago->Módulos de eventos y coloque su FM personalizado en el evento 41 como se muestra a continuación:

OBPM3

OBPM3

  • Ahora, genera los archivos de pago. y en AL11 encontrará un archivo generado con extensión .aes.
  • Además, si desea depurar el FM personalizado, debe colocar el bucle infinito y luego iniciar el depurador desde SM50.

Hágame saber si tiene alguna pregunta o duda en el blog anterior y podemos corregirlo en consecuencia.

Gracias,

Vimal




Literales en ABAP | Blogs de SAP
Previo
Lógica personalizada para implementar la numeración de documentos de facturación flexible
Siguiente

Madrid

Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010

México

Paseo de la Reforma 26
Colonia Juárez,  Cuauhtémoc
Ciudad de México 06600

Costa Rica

Real Cariari
Autopista General Cañas, 
San José, SJ 40104

Perú

Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073

Twitter Linkedin Instagram
Copyright 2022 | All Right Reserved.