【问题标题】:SQL Encrypt/Decrypt numbersSQL 加密/解密数字
【发布时间】:2019-08-06 03:08:47
【问题描述】:

我想知道这在 TSQL 中是否可能

我知道 vigenere (cipher) 加密可以将 "Hello, How are you" 之类的值加密为 "Hfnlp, Jox crf aov" 但问题是它保持数字未加密 "1234567" 将保持 "1234567"

知道如何加密包括数字在内的所有内容并将其作为 SQL Server 中的函数/过程?

【问题讨论】:

标签: sql-server tsql encryption caesar-cipher


【解决方案1】:

我自己构建了脚本

加密

ALTER FUNCTION [dbo].[fnEncrypt] 
(
    @Str varchar(max),
    @key varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
--Akram Mustafa
declare @i int = 1
declare @x int = 0
declare @Result varchar(max) = ''
declare @List varchar(100) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
declare @TempKey varchar(max) = @key

WHILE LEN(@TempKey) < LEN(@Str)
BEGIN
    SET @TempKey = @TempKey + @key 
END

SET @key = @TempKey

WHILE (@i <= LEN(@Str)) 
BEGIN
    IF (CHARINDEX(SUBSTRING(@Str, @i, 1), @List) > 0)
    BEGIN
        SET @x = ((CHARINDEX(SUBSTRING(@Str, @i, 1), @List) +  CHARINDEX(SUBSTRING(@key, @i, 1), @List)) % LEN(@List)) + 1
        SET @Result = @Result + SUBSTRING(@List, @x, 1)
    END
    ELSE
    BEGIN
        SET @Result = @Result + SUBSTRING(@Str, @i, 1)
    END
    SET @i = @i + 1
END

RETURN @Result
END

解密

ALTER FUNCTION [dbo].[fnDecrypt] 
(
    @Str varchar(max),
    @key varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
--Akram Mustafa
declare @i int = 1
declare @x int = 0
declare @Result varchar(max) = ''
declare @List varchar(100) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
declare @TempKey varchar(max) = @key

WHILE LEN(@TempKey) < LEN(@Str)
BEGIN
    SET @TempKey = @TempKey + @key 
END

SET @key = @TempKey

WHILE (@i <= LEN(@Str)) 
BEGIN
    IF (CHARINDEX(SUBSTRING(@Str, @i, 1), @List) > 0)
    BEGIN
        SET @x = ((CHARINDEX(SUBSTRING(@Str, @i, 1), @List) -  CHARINDEX(SUBSTRING(@key, @i, 1), @List) + LEN(@List) - 1) % LEN(@List))
        IF @x = 0
        BEGIN
            SET @x = LEN(@List)
        END
        SET @Result = @Result + SUBSTRING(@List, @x, 1)
    END
    ELSE
    BEGIN
        SET @Result = @Result + SUBSTRING(@Str, @i, 1)
    END
    SET @i = @i + 1
END

RETURN @Result
END

【讨论】:

  • 无论你做什么,实际上都不要用它来加密任何值得保密的东西。它可以作为家庭作业或娱乐,但不能用于生产数据库。
  • @JeroenMostert 为什么?
  • 因为加密的基本规则是永远不要自己动手,除非您已经是该领域的专家。使用经过专业人士审查的算法和实现,以免受到攻击。像这样的替换密码具有众所周知的破解技术——例如,尝试使用您喜欢的任何密钥加密AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,看看确定密钥长度是多么容易。 See also。 SQL Server 的内置函数基于行业标准,没有这些弱点。
  • @JeroenMostert 感谢您的建议,但它将用于同一组织内非 IT 人员的基本需求,除了他们将无法调用函数,他们只会看到加密的值
  • 正确的衡量标准不是“我的用户有多无知/坚持不懈”,而是“数据有多重要”。如果你用它来保护你奶奶最喜欢的酸橙派食谱或 CEO 的高尔夫统计数据,那很好。如果您使用它来保护您客户的信用卡号码或 HR 对您同事的评估,那么就没有那么多了。如果发生任何确实的事情,使用适当的加密是掩饰自己的好方法,而不是不得不承认你只是拼凑一些对你来说看起来不错的东西。
猜你喜欢
  • 2019-08-02
  • 2017-08-06
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2015-06-18
相关资源
最近更新 更多