Included within the latest Technology Refreshes, IBM i 7.5 TR3 and 7.4 TR9, is an improved encryption algorithm for AES, which uses a 256 bit key. It is as easy to use as the older versions of encryption I wrote about over a year ago. I just wanted to take this opportunity to reinforce the best ways of using it.
It is a scalar function that does the encryption. Its syntax is just:
ENCRYPT_AES256(< string or variable >, < password string >, < hint >) |
In its simplest for I can just use it like:
01 VALUES BINARY(ENCRYPT_AES256('This is RPGPGM.COM','Password')) |
'This is RPGPGM.COM' is what I am going to encrypt.
'Password' is the password string to use.
I am not going to pass a password hint in this example.
Notice how ENCRYPT_AES256 is contained within a BINARY scalar function. If I just use the ENCRYPT_AES256 on its own the results contain all kinds of special characters, which are not easily supported by HTML. If I translate the result to binary then I can show the binary string returned.
The result is:
00001 --------------------------------- CCF40CFF0025D5B9B96180506FFE4F... |
The three dots indicate that the result is larger than what I have decided to show.
If I am going to give good examples then I need somewhere to store my results, let's say in a table. The SQL DDL table is called TABLE1 and it will be created in my library, MYLIB.
01 CREATE OR REPLACE TABLE MYLIB.TABLE1 02 (UNENCRYPTED VARCHAR(10), 03 TYPE_AES256 VARCHAR(128) FOR BIT DATA, 04 TYPE_AES VARCHAR(128) FOR BIT DATA, 05 PRIMARY KEY(UNENCRYPTED)) 06 ON REPLACE DELETE ROWS |
Line 2: This column will contain the unencrypted value.
Line 3: This column will contain the encrypted value generated the new AES256 algorithm. Note that the column must be a variable character of a maximum of 128 characters. And it must have the FOR BIT DATA.
Line 4: This column will contain the old version of AES.
Let me insert one row into the file:
01 INSERT INTO TABLE1 VALUES( 02 'FIRST', 03 ENCRYPT_AES256('FIRST','Stockholm','Favorite European city'), 04 ENCRYPT_AES('FIRST','Stockholm','Favorite European city')) |
Line 2: Is the value that is added to the unencrypted column.
Line 3: Here I am encrypting the value 'FIRST' using the AES256 algorithm, with the password of 'Stockholm'. I have given the password hint too, 'Favorite European city''.
Line 4: Here I am encrypting using the old AES algorithm, with the same password and hint.
If you want to see how to use the password hint I recommend you read my previous post about encryption.
Having inserted the row I can view it:
01 SELECT UNENCRYPTED, 02 BINARY(TYPE_AES256), 03 BINARY(TYPE_AES) 04 FROM TABLE1 |
Again I am using the BINARY scalar function to convert the bit data returned from the two encrypted columns.
UNENCRYPTED AES256 AES ----------- --------------- --------------- FIRST CCD62A160025... 4CCD33160025... |
IMHO the only way to test if the encryption was successful is to have a successful decryption. For that I use the DECRYPT_BIT scalar function, see below:
01 SELECT UNENCRYPTED, 02 DECRYPT_BIT(TYPE_AES256,'Stockholm') AS "AES256", 03 DECRYPT_BIT(TYPE_AES,'Stockholm') AS "AES" 04 FROM TABLE1 |
Lines 2 and 3: I need the password to unencrypt.
The results of the above statement is:
UNENCRYPTED AES256 AES ----------- ------- ----- FIRST FIRST FIRST |
Rather than have to give the password, and if I want the hint, I use the SET ENCRPYTION PASSWORD statement:
01 SET ENCRYPTION PASSWORD = 'Stockholm' 02 WITH HINT = 'Favorite European city' |
Now when I use the encryption scalar functions I don't have to give the password, they use the one I set above:
01 INSERT INTO TABLE1 VALUES( 02 'SECOND',ENCRYPT_AES256('SECOND'),ENCRYPT_AES('SECOND')) |
And the same is true of the when I decrypt:
01 SELECT UNENCRYPTED, 02 DECRYPT_BIT(TYPE_AES256) AS "AES256", 03 DECRYPT_BIT(TYPE_AES) AS "AES" 04 FROM TABLE1 |
The results for the above statement are:
UNENCRYPTED AES256 AES ----------- ------- ------ FIRST FIRST FIRST SECOND SECOND SECOND |
Performing all of the above in ACS's Run SQL Scripts does not give a real world example. I am going to show you how to use this in a RPG program:
01 **free 02 dcl-s Password char(9) inz('Stockholm') ; 03 dcl-s Hint char(22) inz('Favorite European city') ; 04 dcl-s Unencrypted varchar(10) ; 05 dcl-s AES256 varchar(10) ; 06 dcl-s AES varchar(10) ; 07 exec sql SET ENCRYPTION PASSWORD = :Password WITH HINT = :Hint ; 08 exec sql INSERT INTO TABLE1 VALUES( 'THIRD', ENCRYPT_AES256('THIRD'), ENCRYPT_AES('THIRD')) ; 09 exec sql SELECT UNENCRYPTED, DECRYPT_BIT(TYPE_AES256), DECRYPT_BIT(TYPE_AES) INTO :Unencrypted,:AES256,:AES FROM TABLE1 WHERE UNENCRYPTED = 'THIRD' ; 10 dsply (Unencrypted + ',' + AES256 + ',' + AES) ; |
Line 1: This code is modern RPG.
Lines 2 and 3: I have defined this two variables to contain the password and password hint. If this was a production environment I could pass these to the program to ensure that all programs use the save encryption password.
Lines 4 – 6: I will be using these variables to contain the decrypted results.
Line 7: I am setting the encryption password and hint.
Line 8: I am inserting a record into the Table, and encrypting the two columns as I did before.
Line 9: I am using a Select statement to retrieve the row I inserted in line 8. What follows the INTO are the RPG variables that the values from the columns listed in the select columns section are moved to.
Line 10: I use a Display operation code, DSPLY, to display the contents of those RPG variables.
After compiling when I call the program the following is displayed:
DSPLY THIRD,THIRD,THIRD |
Showing that the encrypted columns were decrypted successfully.
I will be converting the programs I have used the ENCRYPT_AES within to use the new more secure ENCRYPT_AES256 function.
You can learn more about the changes to SQL's ENCRYPT_AES256 scalar function from the IBM website here.
This article was written for IBM i 7.5 TR3 and 7.4 TR9.
No comments:
Post a Comment
To prevent "comment spam" all comments are moderated.
Learn about this website's comments policy here.
Some people have reported that they cannot post a comment using certain computers and browsers. If this is you feel free to use the Contact Form to send me the comment and I will post it for you, please include the title of the post so I know which one to post the comment to.