<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
&nbsp;<BR>
Here is somthing that I have done.<BR>
I haved created an encypted logon record structure<BR>
Each column&nbsp; has its own encryption keys.<BR>The&nbsp;QUICK user has read permission to this structure<BR>and&nbsp;the QUICK user can update it if he knows the<BR>the answer to the secret question.<BR>
The QUICK&nbsp;user can only update the password field and the set date.<BR>
This leaves creating an account for some other user.<BR>
The&nbsp;E_MAIL field was used as alternate key if the user forgot his&nbsp;user_name.<BR>
<BR>&nbsp;The structure is<BR>&nbsp;<BR>Logon_Info<BR>&nbsp;&nbsp; USER_NAME segment<BR>
&nbsp;&nbsp; PASSWORD&nbsp; segment<BR>
&nbsp;&nbsp; E_MAIL&nbsp;&nbsp;&nbsp; unique key<BR>
&nbsp;&nbsp; SET_DATE <BR>&nbsp;&nbsp; SECRET_QUESTION<BR>&nbsp;&nbsp; SECRET_ANSWER&nbsp; <BR>
<BR>On the first screen prompt for <BR>
the user name and password and encryted the entered values.<BR>
Lookup on LOGON_INFO<BR>
PROCEDURE INTERNAL ENCRYPT_DATE<BR>BEGIN<BR>&nbsp;&nbsp; T_DS = ASCII ( T_SET_DATE, 8 ) <BR>&nbsp;&nbsp; LET DECADE = DECADES[ (NCONV ( T_DS[3:1] ) + 1 ) : 1 ] <BR>&nbsp;&nbsp; LET YEAR = YEARS [&nbsp;&nbsp;&nbsp; (NCONV ( T_DS[4:1] ) + 1 ) : 1 ]<BR>&nbsp;&nbsp; LET MONTH = MONTHS [&nbsp; (NCONV ( T_DS[5:2] ) + 1 ) : 1 ]<BR>&nbsp;&nbsp; LET DAY1&nbsp; = DAY1S [&nbsp;&nbsp; (NCONV ( T_DS[7:1] ) + 1 ) : 1 ]<BR>&nbsp;&nbsp; LET DAY2&nbsp; = DAY2S [&nbsp;&nbsp; (NCONV ( T_DS[8:1] ) + 1 ) : 1 ]<BR>&nbsp;&nbsp; LET T_DATE_STRING = YEAR + DECADE + DAY2 + MONTH + DAY1<BR>&nbsp;&nbsp; LET T_DATE_STRING = ENCYPT ( ENCRYPT ( T_DATE_STRING, 'ZRWEFJBC') , 'TQHSTGCX')<BR>END<BR>
PROCEDURE INTERNAL DECRYPT_DATE<BR>BEGIN<BR>&nbsp;&nbsp; LET T_DATE_STRING = DECYPT ( DECRYPT ( T_DATE_STRING, 'TQHSTGCX') , 'ZRWEFJBC')<BR>&nbsp;&nbsp; LET DECADE = T_DATE_STRING[2:1]<BR>&nbsp;&nbsp; LET YEAR&nbsp;&nbsp; = T_DATE_STRING[1:1]<BR>&nbsp;&nbsp; LET MONTH&nbsp; = T_DATE_STRING[4:1]<BR>&nbsp;&nbsp; LET DAY1&nbsp;&nbsp; = T_DATE_STRING[5:1]<BR>&nbsp;&nbsp; LET DAY2&nbsp;&nbsp; = T_DATE_STRING[3:1]<BR>&nbsp;&nbsp; LET T_SET_DATE = 20000000 + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( INDEX ( DECADES, DECADE ) - 1 ) * 100000 + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( INDEX ( YEARS, YEAR ) - 1 ) * 10000 + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( INDEX ( MONTHS, MONTH ) - 1 ) * 100 + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( INDEX ( DAY1S, DAY1 ) - 1 ) * 10 + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( INDEX ( DAY2S, DAY2 ) - 1 )<BR>; There should be a valid date check here in case something went <BR>; wrong. Also, the date should be less than SYSDATE.&nbsp; <BR>END<BR>
PROCEDURE DESIGNER RSPASS help 'Reset password' nodata<BR>BEGIN<BR>&nbsp; LET T_SECRET_QUESTION = decrypt secret question<BR>&nbsp; DISPLAY T_SECRET_QUESTION<BR>&nbsp; ACCEPT T_SECRET_ANSWER<BR>&nbsp; T_SECRET_ANSWER2 = encrpyt T_SECRET_ANSWER<BR>&nbsp; IF T_SECRET_ANSWER2 = SECRET_ANSWER OF LOGON_INFO<BR>&nbsp; THEN BEGIN<BR>&nbsp;&nbsp; ACCEPT T_PASS1<BR>&nbsp;&nbsp; ACCEPT T_PASS2<BR>&nbsp;&nbsp; IF T_PASS1 &lt;&gt; T_PASS2<BR>&nbsp;&nbsp;&nbsp; THEN error "Passwords do not agree. "<BR>&nbsp; LET PASSWORD of LOGON_INFO = ENCRYPT ( ENCRPYT( T_PASS1, 'YODGLZM' ), 'GHIKSNRW') ) <BR>&nbsp; LET T_SET_DATE = SYSDATE<BR>&nbsp; DO INTERNAL ENCRPT_DATE<BR>&nbsp; LET SET_DATE OF LOGON_INFO = T_DATE_STRING<BR>&nbsp; PUT LOGON_INFO<BR>&nbsp; COMMIT UPDATE<BR>&nbsp; LOGON_OK = 'Y'<BR>&nbsp; END<BR>&nbsp; ELSE ERROR "The answer is incorrect."<BR>END ; RSPASS<BR>
<BR>PROCEDURE INTERNAL PROMPT_LOGIN<BR>BEGIN<BR>&nbsp; LET LOGIN_OK = 'N'<BR>&nbsp; ACCEPT T_USERNAME<BR>&nbsp; ACCEPT T_PASSWORD<BR>; encrpt username &amp; password<BR>GET LOGON_INFO via username , password optional<BR>If NOT ACCESSOK <BR>&nbsp;&nbsp; Then Begin <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF ATTEMPTS &lt; TRY_LIMIT <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INFO = "User name and/or password incorrect. Please try again"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LET ATTEMPTS = ATTEMPTS + 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DO INTERNAL PROMPT_LOGON<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LET T_SET_DATE&nbsp; = DECRYPT_DATE ; decrypted SET_DATE of LOGON_INFO<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF EXP_DAYS_PASSWORD &lt; DAYS ( SYSDATE ) - DAYS ( T_SET_DATE )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THEN BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; INFO = "Password has expired."<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PUSH RSPASS<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE BEGIN<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOGON_OK = 'Y'<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF WARN_DAYS_PASSWORD &lt; DAYS ( SYSDATE ) - DAYS ( T_SET_DATE )<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; THEN INFO = 'Password will expire in ' + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ASCII ( ( EXP_DAYS_PASSWORD - &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAYS ( SYSDATE ) +&nbsp; &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DAYS ( T_SET_DATE ) ) + &amp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' days. '<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ELSE NULL<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; END<BR>END; PROMPT_LOGIN<BR>
<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>
&nbsp;<BR>
&nbsp;<BR>
<BR><BR><BR>&gt; Subject: Powerhouse Web Security<BR>&gt; Date: Wed, 13 Feb 2008 12:48:52 -0800<BR>&gt; From: Paul.M.Hodson@gov.bc.ca<BR>&gt; To: powerh-l@lists.sowder.com<BR>&gt; <BR>&gt; We are looking at user authentication for our powerhouse web environment. We are currently using a table with ID's and Passwords but the management falls to IT. Would prefer that we use our clients as the point of contact and a more robust approach - more web like using question reminders and self-serve password resets.<BR>&gt; <BR>&gt; Any insight? Suggestion?<BR>&gt; <BR>&gt; Thanks,<BR>&gt; Paul Hodson<BR>&gt; <BR>&gt; <BR>&gt; <BR>&gt; -- <BR>&gt; = = = = = = = = = = = = = = = = = = = = = = = = = = = =<BR>&gt; Mailing list: powerh-l@lists.sowder.com<BR>&gt; Subscribe: &amp;quot;subscribe&amp;quot; in message body to powerh-l-request@lists.sowder.com<BR>&gt; Unsubscribe: &amp;quot;unsubscribe &amp;lt;password&amp;gt;&amp;quot; in message body to powerh-l-request@lists.sowder.com<BR>&gt; http://lists.sowder.com/mailman/listinfo/powerh-l<BR>&gt; This list is closed, thus to post to the list you must be a subscriber.<BR>&gt; Add 'site:lists.sowder.com powerh-l' to your search terms to search the list archive at Google.<BR><BR><br /><hr /> <a href='' target='_new'></a></body>
</html>