فرآیند شخصی‌سازی و فعال‌سازی سیاست پیچیدگی رمز عبور در Oracle

در Oracle Database توابع از پیش تعریف‌شده‌ای برای اعمال محدودیت روی پیچیدگی رمز عبور ارایه شده که می‌توانند در پروفایل کاربر مورد استفاده قرار گیرند.

جستجو و فعال‌سازی توابع از پیش تعریف‌شده

برای دیدن پروفایل‌ها و توابع مربوط به بررسی رمز عبور:

select profile , resource_name , limit from dba_profiles where resource_name='PASSWORD_VERIFY_FUNCTION';

PROFILE                        RESOURCE_NAME                    LIMIT
------------------------------ -------------------------------- ---------------------------
DEFAULT                        PASSWORD_VERIFY_FUNCTION         NULL
ORA_STIG_PROFILE               PASSWORD_VERIFY_FUNCTION         ORA12C_STIG_VERIFY_FUNCTION

در صورتی که این موضوع بصورت پیش فرض وجود نداشت، می توانیم از دستور زیر در دیتابیس استفاده کنیم:

@?/rdbms/admin/utlpwdmg.sql

 

و بعد از اجرا بصورت زیر تغییر می یابد:

 

SELECT profile, resource_name, limit FROM dba_profiles WHERE resource_name = 'PASSWORD_VERIFY_FUNCTION'; 

PROFILE                        RESOURCE_NAME                    LIMIT
------------------------------ -------------------------------- ---------------------------
DEFAULT                        PASSWORD_VERIFY_FUNCTION         ORA12C_VERIFY_FUNCTION
ORA_STIG_PROFILE               PASSWORD_VERIFY_FUNCTION         ORA12C_STIG_VERIFY_FUNCTION

 

نمونه توابع از پیش تعریف Oracle

ORA12C_VERIFY_FUNCTION

  • حداقل 8 کاراکتر

  • داشتن حرف، عدد، علامت خاص

  • نباید شامل user name ، database name و "oracle" باشد

  • حداقل 3 کاراکتر تفاوت با رمز قبلی

 

ساخت توابع شخصی سازی شده

می‌توانیم توابع را خودمان بسازیم تا شروط خاص را اعمال کنیم. نمونه:

 

CREATE OR REPLACE FUNCTION vahiddb_19c_verify_function (
   username     VARCHAR2,
   password     VARCHAR2,
   old_password VARCHAR2)
RETURN BOOLEAN IS
   differ  INTEGER;
   lang    VARCHAR2(512);
   message VARCHAR2(512);
   ret     NUMBER;
BEGIN
   lang := sys_context('userenv','lang');
   lang := substr(lang, 1, instr(lang, '_') - 1);

   IF NOT ora_complexity_check(password, chars => 12, uppercase => 1, lowercase => 1,
                               digit => 1, special => 1) THEN
      RETURN FALSE;
   END IF;

   IF old_password IS NOT NULL THEN
      differ := ora_string_distance(old_password, password);
      IF differ < 8 THEN
         ret := utl_lms.get_message(28211, 'RDBMS', 'ORA', lang, message);
         raise_application_error(-20000, utl_lms.format_message(message, 'eight'));
      END IF;
   END IF;

   RETURN TRUE;
END;
/

 

تست و اتصال به پروفایل

ایجاد یک پروفایل:

 

CREATE PROFILE app_profile LIMIT
  PASSWORD_VERIFY_FUNCTION vahiddb_19c_verify_function
  PASSWORD_REUSE_TIME 365
  PASSWORD_REUSE_MAX 3;

 

سرانجام تست و مالک کردن پروفایل:

 

CREATE USER test IDENTIFIED BY test PROFILE app_profile;

 

خروجی:

 

ORA-28003: password verification for the specified password failed
ORA-20000: password length less than 12 bytes

 

که نشان می‌دهد فانکشن در حال کار و اعمال سیاست پیچیدگی رمز می‌باشد.