【问题标题】:Encrypt and Decrypt a String value with return type as String加密和解密返回类型为字符串的字符串值
【发布时间】:2020-07-14 08:37:15
【问题描述】:

我想在 sql 中有一个函数来加密给定的varchar 值并将其作为varchar 返回,反之亦然。我已经检查了sql的以下功能,例如:

ENCRYPTBYPASSPHRASEENCRYPTBYKEYENCRYPTBYCERT

我还在这里查看了其他问题,但我无法找到(或可能理解)我正在寻找的解决方案。我想要做的是将加密的字符串作为查询字符串传递给一个 URL(我希望从 Db 执行此操作),它没有任何 /,这样它就不会与 URL 路由混淆。

第 1 步:我制作了随机字符串生成器。 (作品)

DECLARE @RandomString VARCHAR (500) = ( SELECT RandomString
                                        FROM   dbo.SfRandomStringGenerator (64, 1) );

示例字符串: X922t1N2udpdi30HZN9W4U9N997UatHZMJKWvI4si0w9g9q6FA3Lqd8NxCJXAe5D

第 2 步:我想加密第 1 步中的字符串,以便输出也是字符串格式,但我遇到的所有加密方法都返回 VARBINARY,这不是我想要的。

Declare @EncryptedString Nvarchar(MAX)=dbo.SfEncrypt(@RandomString)
Select @EncryptedString

示例字符串: WDkyMnQxTjJ1ZHBkaTMwSFpOOVc0VTlOOTk3VWF0SFpNSktXdkk0c2kwdzlnOXE2RkEzTHFkOE54Q0pYQWU1RA

第 3 步:我还希望能够解密加密的字符串。

Declare @DecryptedString Nvarchar(MAX)=dbo.SfDecrypt(@RandomString)
Select @DecryptedString

示例字符串: X922t1N2udpdi30HZN9W4U9N997UatHZMJKWvI4si0w9g9q6FA3Lqd8NxCJXAe5D

到目前为止,我还没有得到我想要的加密。 任何有关解决方案的帮助或指示都会有所帮助。谢谢。

【问题讨论】:

  • 文档看不懂,看不懂怎么办?到目前为止你做了什么,什么没用?
  • @Larnu ,对问题进行了更改。请检查。
  • 请阅读this,了解一些改进问题的技巧。您似乎在问如何将convert(或castVarBinary 转换为VarChar
  • @HABO 不。我不是在寻找演员或转换。但是感谢您提供改进链接。

标签: sql sql-server tsql encryption


【解决方案1】:

将 VARBINARY 结果读入 byte[] 数组。

使用 System.Convert.ToBase64String() 将 byte[] 数组转换为 Base 64 字符串

Base64 包含+/ 字符,它们在url 路径中具有特殊含义,因此必须对其进行编码。

使用 System.Web.HttpUtility.UrlEncode(string) 对 base 64 字符串进行 UrlEncode,以使用 %2B%2F 对任何 +/ 字符进行编码。

然后您应该能够将 url 编码的字符串添加到您的 url。

在 url 端点上,逆向获取原始加密的 byte[] 数组。

编辑:请注意,使用查询字符串可能会遇到长度限制,大约为 2048 个字符,因此如果您的数据大于此长度,您可能会发现服务器将拒绝处理请求。

在这种情况下,请考虑使用 POST 发送数据,并在消息请求的正文中提供加密数据。

编辑回应评论:

我认为您会在将“加密”查询的结果作为 url 发送到服务器之前对其进行处理,因此 SQL 加密函数返回 varbinary 的事实不应该出现问题。

如果您很高兴您实际上可以在 TSQL 中进行加密和解密,那么我将向您推荐 this SO 帖子,它提供了一种在中进行 Base-64 编码和解码的方法TSQL 关心 xml 查询 api。对 varbinary 字段进行加密,通过示例运行它以生成 base64 varchar,然后使用 TSQL REPLACE 将 '+' 转换为 '%2B' 和 '/' 转换为 '%2F'

然后,您将获得输入数据的 url 编码、base-64 编码、加密表示形式的 varchar 值,可以安全地作为查询字符串传输。

【讨论】:

  • 你在告诉我 C# 方式,而我实际上是在寻找 SQL 方式。另外,我想加密字符串而不仅仅是编码。
  • 在 RFC 4648 第 5 节中描述了 Base-64 的 URL 安全版本。它使用减号“-”和下划线“_”代替标准 Base 中的“+”和“/” -64。如果您想在 URL 中包含输出,您可能会发现该版本更有用。
  • @Sudeep Fair 评论 - 我已经修改了我的回复
猜你喜欢
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
  • 2014-02-07
相关资源
最近更新 更多