Use Master
go
Create database LoginTest
Go
Use LoginTest
go
Create table SecurityQuestion
(
QuestionKey int identity(1,1) primary key,
Question nvarchar(255) not null
)
go
Create table UserLogin
(
UserKey int identity(1,1) primary key,
UserName nvarchar(50) not null,
UserEmail nvarchar(255) not null,
UserRandomInt int not null,
UserPassword varBinary(500) not null,
UserDateEntered Date not null,
UserDateLastModified Date not null,
)
alter table UserLogin
add constraint unique_UserName unique(userName)
alter table UserLogin
add constraint unique_Email unique(useremail)
go
Create Table UserSecurityQuestion
(
UserKey int Foreign Key references UserLogin(UserKey) not null,
QuestionKey int Foreign Key references SecurityQuestion(QuestionKey) not null,
UserAnswer NVarchar(255) not null,
Constraint PK_UserSecurityQuestion primary key(UserKey, QuestionKey),
)
Go
Create table LoginHistory
(
LoginHistoryKey int identity(1,1) primary key,
UserKey int foreign key references UserLogin(userKey),
LoginHistoryDateTime datetime default GetDate()
)
Go
Insert into SecurityQuestion(Question)
values('Where were you when you got your first traffic ticket?'),
('What is your least favorite book?'),
('What acloholic drink made you the sickest?'),
('What food do you truely hate?')
go
create function fx_hashPassword
(@password nvarchar(50), @RandomInt int)
returns varbinary(500)
As
begin
Declare @Combined nvarchar(60)
Declare @hashed varbinary(500)
Set @Combined = @password + cast(@randomInt as Nvarchar(10))
Set @hashed = HASHBYTES('sha2_512', @combined)
return @hashed
End
go
Select dbo.fx_hashPassword('mypass','1342567901')
Go
Create function fx_getRandomInt()
returns int
As
Begin
Declare @intNumber int
set @intNumber=DatePart(NanoSecond, GetDate())
return @intNumber
End
go
--password, all the info for login table
--userKey as output
--write to userlogin table
--write security question table
--write to login history table
--put in transaction
Alter proc usp_NewLogin
@userName nvarchar(50),
@Password nvarchar(50),
@userEmail nvarchar(255),
@securityQuestion int,
@answer nvarchar(255)
As
--declare internal variables
Declare @intRandom int
Declare @hash varbinary(500)
Declare @Date Date
--check to see if user exists
If Exists
(Select userKey from userLogin
where userName=@userName
And UserEmail=@userEmail)
Begin
Print 'user already exists'
return -1
End
--get random seed
select @intRandom=dbo.fx_getRandomInt()
--get hash of password
select @hash = dbo.fx_hashPassword(@password, @intRandom)
Set @date =GetDate()
--Begin transaction
Begin tran
Begin try
--insert int userLogin
Insert into UserLogin(UserName, UserEmail, UserRandomInt, UserPassword, UserDateEntered, UserDateLastModified)
Values(@username, @userEmail, @intRandom, @hash, @date, @date)
Declare @UserKey int
Set @UserKey= Ident_Current('UserLogin')
--insert into userSecurityQuestion
Insert into UserSecurityQuestion(UserKey, QuestionKey, UserAnswer)
Values(@UserKey, @SecurityQuestion, @answer)
--Insert into LoginHistory
Insert into LoginHistory(UserKey, LoginHistoryDateTime)
values(@UserKey, @Date)
commit tran
Return @userKey
End Try
Begin Catch
Rollback tran
return 0
End Catch
Exec usp_NewLogin
@userName='George',
@Password='P@ssw0rd1',
@userEmail='George@gmail.com',
@securityQuestion=3,
@answer='whiskey'
Select * from SecurityQuestion
Select * From userLogin
Select * From UserSecurityQuestion
Select * From LoginHistory
--existing login
--intake password username
--get the salt that goes with the username
--(-1) if no username
--rehash the text password with the salt
--compare the hashes
--if they match the login is successful return user key
--if they fail return 0
go
Alter proc usp_Login
@Password nvarchar(50),
@userName nvarchar(50)
As
Declare @intRandom int
Declare @Newhash varbinary(500)
Declare @DBHash varbinary(500)
Declare @UserKey int
Select @UserKey= userKey, @intRandom=UserRandomInt, @DBHash=userPassword from UserLogin
Where UserName=@userName
if @IntRandom is null
Begin
Print '-1'
Return -1
End
Select @newHash=dbo.fx_hashPassword(@password, @intRandom)
if @DBHash=@Newhash
Begin
insert into LoginHistory(UserKey, loginHistoryDateTime)
Values(@UserKey,GetDate())
print cast(@UserKey as nvarchar(10))
Return @UserKey
end
Else
Begin
print '0'
Return 0
End
Exec usp_login
@Password='P@ssw0rd1',
@userName='spconger'
Select * From LoginHistory
/*
login and validate
Get new Password
Rehash the passord
Update the Login table
*/
go
Create proc usp_ChangePassword
@userName nvarchar(50),
@password nvarchar(50),
@newPassword nvarchar(50)
As
Declare @intRandom int
Declare @Newhash varbinary(500)
Declare @DBHash varbinary(500)
Declare @UserKey int
Select @UserKey= userKey, @intRandom=UserRandomInt, @DBHash=userPassword from UserLogin
Where UserName=@userName
if @IntRandom is null
Begin
Print '-1'
Return -1
End
Select @newHash=dbo.fx_hashPassword(@password, @intRandom)
if @DBHash=@Newhash
Begin
Declare @newRandom int
Set @newRandom=dbo.fx_getRandomInt()
Declare @UpdateHash varbinary(500)
Set @UpdateHash=dbo.fx_hashPassword(@newPassword, @NewRandom)
update UserLogin
Set UserRandomInt=@newRandom,
UserPassword=@updateHash
Where userKey=@UserKey
insert into LoginHistory(UserKey, loginHistoryDateTime)
Values(@UserKey,GetDate())
print cast(@UserKey as nvarchar(10))
Return @UserKey
end
Else
Begin
print '0'
Return 0
End
Select * from userLogin
exec usp_ChangePassword
@userName = 'spconger',
@password='P@ssw0rd1',
@newPassword='P@ssw0rd2'
Exec usp_login
@Password='P@ssw0rd2',
@userName='spconger'
Tuesday, August 18, 2015
Login Stored procedures and test database
Subscribe to:
Comments (Atom)