Will man beispielsweise in SAP HANA automatisiert User anlegen, benötigt man einen SAP HANA Password Generator. Im ABAP-Umfeld gibt es hierzu eine Reihe von Funktionsbausteinen, wie z.B. RSEC_GENERATE_PASSWORD, um sich sichere Passwörter abhängig von den Systemeinstellungen erstellen zu lassen. Im SAP HANA Umfeld sucht man eine solche Funktion leider vergebens.
In Anlehnung an den FuBa RSEC_GENERATE_PASSWORD haben wir daher eine Stored Procedure entwickelt, die die Aufgabe eines SAP HANA Password Generators übernimmmt. Wir stellen hier die Funktion kostenlos für Sie zur Verfügung.
Features von SAP HANA Password Generator
Die Funktion hat zwei Input-Parameter. Zum einem i_length, was die Länge das Passworts bestimmt und zum anderem i_layout, welches Format das Passwort haben soll – also ob, Zahlen, Sonderzeichen, etc. enthalten sein sollen. Die beiden Parameter sind optional. Falls sie nicht übergeben werden, werden die Systemeinstellungen aus der View „SYS“.“M_PASSWORD_POLICY“ übernommen und verarbeitet. Nach der Passwort-Generierung wird abschließend geprüft, ob alle geforderten Layout-Einstellungen erfüllt sind. Falls nicht, wird das Passwort nochmals generiert.
Coding und Aufruf
Package: de.intellify.lib
PROCEDURE "_SYS_BIC"."de.intellify.lib::generate_password" ( in i_length INT DEFAULT 0, in i_layout VARCHAR(10) DEFAULT '', out o_pass VARCHAR(255)) LANGUAGE SQLSCRIPT SQL SECURITY DEFINER READS SQL DATA AS BEGIN DECLARE v_length INT; DECLARE v_cnt INT DEFAULT 0; DECLARE v_pos INT; DECLARE v_found INT; DECLARE v_chr VARCHAR(1); DECLARE v_layout VARCHAR(10); DECLARE v_vals VARCHAR(255) DEFAULT ''; DECLARE v_pass VARCHAR(255) DEFAULT ''; DECLARE v_pass_correct VARCHAR(1) DEFAULT ''; DECLARE v_continue VARCHAR(1) DEFAULT ''; DECLARE v_check_upper VARCHAR(1) DEFAULT ''; DECLARE v_check_lower VARCHAR(1) DEFAULT ''; DECLARE v_check_digit VARCHAR(1) DEFAULT ''; DECLARE v_check_spec VARCHAR(1) DEFAULT ''; -- Possible values for the password DECLARE c_upper VARCHAR(24) DEFAULT 'ABCDEFGHJKLMNPQRSTUVWXYZ'; DECLARE c_lower VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz'; DECLARE c_digit VARCHAR(8) DEFAULT '23456789'; DECLARE c_spec VARCHAR(19) DEFAULT '@$%&/\()=+-#~<>[]{}'; -- Password length from parameter or system settings IF i_length = 0 THEN SELECT "VALUE" INTO v_length FROM M_PASSWORD_POLICY WHERE PROPERTY = 'minimal_password_length'; ELSE v_length := i_length; END IF ; -- Password layout from parameter or system settings IF i_layout = '' THEN SELECT "VALUE" INTO v_layout FROM M_PASSWORD_POLICY WHERE PROPERTY = 'password_layout'; ELSE v_layout := i_layout; END IF; -- Generate the password -- Build value string select locate_regexpr('[A-Z]' in v_layout) into v_found from dummy; IF v_found > 0 THEN v_vals := c_upper; v_check_upper := 'X'; END IF; select locate_regexpr('[a-z]' in v_layout) into v_found from dummy; IF v_found > 0 THEN v_vals := v_vals || c_lower; v_check_lower := 'X'; END IF; select locate_regexpr('[0-9]' in v_layout) into v_found from dummy; IF v_found > 0 THEN v_vals := v_vals || c_digit; v_check_digit := 'X'; END IF; select locate_regexpr('[^a-zA-Z0-9]' in v_layout) into v_found from dummy; IF v_found > 0 THEN v_vals := v_vals || c_spec; v_check_spec := 'X'; END IF; -- generating the password WHILE v_pass_correct = '' DO v_pass := ''; v_cnt := 0; v_continue := ''; WHILE v_length > v_cnt DO v_pos := ROUND( RAND_SECURE( ) * ( LENGTH( v_vals ) - 1 ) + 1 ); v_chr := SUBSTR(:v_vals, :v_pos, 1 ); v_pass := :v_pass || :v_chr; v_cnt := v_cnt + 1; END WHILE; -- Check password if it contains the necessary characters IF v_check_upper = 'X' THEN select locate_regexpr('[A-Z]' in v_pass) into v_found from dummy; IF v_found = 0 THEN v_continue := 'X'; END IF; END IF ; IF v_check_lower = 'X' THEN select locate_regexpr('[a-z]' in v_pass) into v_found from dummy; IF v_found = 0 THEN v_continue := 'X'; END IF; END IF ; IF v_check_digit = 'X' THEN select locate_regexpr('[0-9]' in v_pass) into v_found from dummy; IF v_found = 0 THEN v_continue := 'X'; END IF; END IF ; IF v_check_spec = 'X' THEN select locate_regexpr('[^a-zA-Z0-9]' in v_pass) into v_found from dummy; IF v_found = 0 THEN v_continue := 'X'; END IF; END IF ; IF v_continue <> 'X' THEN v_pass_correct := 'X'; END IF; END WHILE; o_pass := :v_pass; END;
Die Syntax-Prüfung im SAP HANA Studio liefert bei den locate_regexpr-Prüfungen einen Syntax-Fehler. Die Procedure kann allerdings ohne Probleme aktiviert werden.
Aufruf Beispiele:
-- Standard Call with system parameters CALL "_SYS_BIC"."de.intellify.lib::generate_password"( o_pass => ?); -- Custom Password Length and Layout CALL "_SYS_BIC"."de.intellify.lib::generate_password"( i_layout => 'Aa1_', i_length => 12, o_pass => ?); -- Custom password only digits CALL "_SYS_BIC"."de.intellify.lib::generate_password"( i_layout => '1', o_pass => ?);
Download
Downloaden Sie hier die Stored Procedure als .hdbprocedure File in einem zip-Archiv.
Password: intellify.de
intellify_generate_password.zip
Kontakt
Benötigen Sie Beratung und/oder Entwicklungsunterstützung in Ihrem SAP HANA Projekt? Dann zögern Sie nicht und kontaktieren uns unverbindlich unter info@intellify.de.
Benötigen Sie Beratungs- oder Entwicklungsunterstützung in Ihrem SAP BW / HANA / SAPUI5 Projekt? Dann zögern Sie nicht und kontaktieren uns unverbindlich unter info@intellify.de.