我在SQL Server 2008 r2中有用户表。什么都没有加密,但我想至少加密密码,直到应用程序准备好,将更好地处理这个。我可以这样做吗?手动使密码加密。
答案 0 :(得分:10)
您可以使用SQL Server加密列,(参见:http://msdn.microsoft.com/en-us/library/ms179331.aspx进行演练)。
您还可以使用从服务器本身发出的密钥。
使用此功能的风险是,如果您必须进行数据恢复并将数据库移至其他服务器,则无法解密该列(需要重置密码)。
答案 1 :(得分:5)
注意:密码哈希不适用于双向加密(流氓dba可以解密它)。它用于以允许验证的方式对其进行散列,而无需向任何人轻易显示密码。较低甚至中等级别的冲突在某些方面 理想 ,因此它允许密码通过(并且不幸的是其他变体)但与冲突你永远无法知道真正的密码到底是什么。
<小时/> 一个简单的实现是通过密码运行HashBytes。您比较提供给存储的哈希的(哈希)密码。除非有人准备好彩虹表,否则他们将无法找到原始密码。
INSERT INTO <tbl> (..., passwd) values (...., HashBytes('SHA1', @password))
验证密码时,您会获取密码的哈希值
SELECT HashBytes('SHA1', @password);
并将其与输入进行比较。
答案 2 :(得分:3)
你实际上不想加密它,而是在它上面使用哈希函数。除非强烈要求访问未加密的密码。
答案 3 :(得分:2)
我们可以创建一些简单的sql函数来加密和解密网页中的Password列:
<强>代码:加密强>
`CREATE FUNCTION [dbo].[ENCRYPT]
(
@DB_ROLE_PASSWORD VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE
@STR_LEN NUMERIC(10),
@ENCRYPTED_PASSWORD VARCHAR(100),
@TRIAL_CHARACTER VARCHAR(1),
@TRIAL_NUMBER NUMERIC(4)
SET @ENCRYPTED_PASSWORD = NULL
SET @STR_LEN =LEN(@DB_ROLE_PASSWORD)
DECLARE
@I INT
SET @I = 1
DECLARE
@LOOP$BOUND INT
SET @LOOP$BOUND = @STR_LEN
WHILE @I <= @LOOP$BOUND
BEGIN
/* * SSMA WARNING MESSAGES: * O2SS0273: ORACLE SUBSTR FUNCTION AND SQL SERVER SUBSTRING FUNCTION MAY GIVE DIFFERENT RESULTS. */
SET @TRIAL_CHARACTER = SUBSTRING(@DB_ROLE_PASSWORD, @I, 1)
SET @TRIAL_NUMBER = ASCII(@TRIAL_CHARACTER)
IF (@TRIAL_NUMBER % 2) = 0
SET @TRIAL_NUMBER = @TRIAL_NUMBER - 6
ELSE
SET @TRIAL_NUMBER = @TRIAL_NUMBER - 8
SET @TRIAL_CHARACTER = CHAR(CAST(@TRIAL_NUMBER + @I AS INT))
SET @ENCRYPTED_PASSWORD = ISNULL(@ENCRYPTED_PASSWORD, '') + ISNULL(@TRIAL_CHARACTER, '')
SET @I = @I + 1
END
RETURN @ENCRYPTED_PASSWORD
END`
<强>代码:解密强>
`CREATE FUNCTION [dbo].[DECRYPT]
(
@DB_ROLE_PASSWORD VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE
@STR_LEN NUMERIC(10),
@DECRYPTED_PASSWORD VARCHAR(100),
@TRIAL_CHARACTER VARCHAR(1),
@TRIAL_NUMBER NUMERIC(4),
@CHECK_CHARACTER VARCHAR(1),
@V_DB_ROLE_PASSWORD VARCHAR(100)
SET @V_DB_ROLE_PASSWORD = @DB_ROLE_PASSWORD
SET @DECRYPTED_PASSWORD = NULL
SET @STR_LEN = LEN(@V_DB_ROLE_PASSWORD)
DECLARE
@I INT
SET @I = 1
DECLARE
@LOOP$BOUND INT
SET @LOOP$BOUND = @STR_LEN
WHILE @I <= @LOOP$BOUND
BEGIN
/*
* SSMA WARNING MESSAGES:
* O2SS0273: ORACLE SUBSTR FUNCTION AND SQL SERVER SUBSTRING FUNCTION MAY GIVE DIFFERENT RESULTS.
*/
SET @TRIAL_CHARACTER = SUBSTRING(@V_DB_ROLE_PASSWORD, @I, 1)
SET @TRIAL_NUMBER = ASCII(@TRIAL_CHARACTER) - @I
IF (@TRIAL_NUMBER % 2) = 0
SET @TRIAL_NUMBER = @TRIAL_NUMBER + 6
/*-IE EVEN*/
ELSE
SET @TRIAL_NUMBER = @TRIAL_NUMBER + 8
/*-IE ODD*/
SET @DECRYPTED_PASSWORD = ISNULL(@DECRYPTED_PASSWORD,'') + ISNULL(CHAR(CAST(@TRIAL_NUMBER AS INT)), '')
SET @I = @I + 1
END
RETURN @DECRYPTED_PASSWORD
END`
答案 4 :(得分:0)
答案 5 :(得分:-5)
是的,你应该在代码中这样做,你可以使用任何算法加密,我建议你md5它是非常安全的,它不能解密。 :)
例如:
public string EncodePassword(string originalPassword)
{
//Declarations
Byte[] originalBytes;
Byte[] encodedBytes;
MD5 md5;
//Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash (encoded password)
md5 = new MD5CryptoServiceProvider();
originalBytes = ASCIIEncoding.Default.GetBytes(originalPassword);
encodedBytes = md5.ComputeHash(originalBytes);
//Convert encoded bytes back to a 'readable' string
return BitConverter.ToString(encodedBytes);
}