【问题标题】:Determining whether a column is an encryption key or plain text确定列是加密密钥还是纯文本
【发布时间】:2013-06-02 06:00:14
【问题描述】:

我们在 SQL Server 表中有一个 varchar(25) 类型的列,该列错误地插入了应该使用 AES 加密的纯文本值。我们将从数据库中删除纯文本值。计划是验证字段的块大小,尽管这会导致留下一些未加密的值。我可以检查任何其他标准来可靠地识别有效的加密数据吗?

我们需要它是一个仅限 T-SQL 的解决方案。

更新

稍微深入一点,它从网络服务中获取值。此 Web 服务使用 ASP.Net 中的 AES 对它们进行加密。它获取返回的字节数组,然后使用此方法将字节数组转换为字符串:

static public string ByteArrToString(byte[] byteArr)
{
  byte val;
  string tempStr = "";
  for (int i = 0; i <= byteArr.GetUpperBound(0); i++)
  {
    val = byteArr[i];
    if (val < (byte)10)
      tempStr += "00" + val.ToString();
    else if (val < (byte)100)
      tempStr += "0" + val.ToString();
    else
      tempStr += val.ToString();
  }
  return tempStr;
}

为了清楚起见,我应该说我最初并没有编写这段代码!

干杯

【问题讨论】:

  • 你是如何加密被加密的数据的?如果使用 SQL 原生函数(例如 encryptbykey)完成,则密钥将与数据 iirc 一起存储。但是,varchar(25) 的列很奇怪...
  • 加密数据通常不能存储为字符串,除非或直到发生了一些额外的编码(例如 base-64)。那么,本例中使用的是什么编码?
  • 用更多信息更新了问题。
  • 我不知道 SQL 服务器如何加密数据,但是当字节被转换为范围从 "000""255" (字符串中的十进制,大端编码)的值时,留下了 @ 987654325@ 字节的数据。这不是很多,甚至比单个 AES 块还要小。

标签: sql sql-server sql-server-2008 encryption aes


【解决方案1】:

不是真的,特别是因为编码方法对我来说看起来不正常。对数据进行base64编码更为常见,这使得它非常独特。这实际上取决于未加密数据的组成,以确定数据是否加密的难易程度 - 例如,它是单词、数字、是否有空格等(因为编码数据没有空格) .

看起来您的编码数据都将用数字表示为字符串,因此根据数据的长度,您可以查看您的列是否会转换为 BIGINT。

我不确定最好的方法,但这里有一个答案可能会帮助您在 T-SQL StackOverflow-8453861 中“尝试强制转换”@

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多