SAP HANA Password Generator Procedure

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.

Hochgeladenes Bild
Dieser Blog-Beitrag wurde von Daniel Schindler geschrieben. Daniel ist ein Senior Consultant & Entwickler für SAP BI, BI-IP und SAP HANA mit mehr als 8 Jahren an Erfahrung. Er verfügt über tiefgreifende Kenntnisse in der Realisierung von Reporting-Anwendungen im SAP Bereich.

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.