Sql server 2005 盐是好盐吗?我的注册/登录过程是否存在任何缺陷?

Sql server 2005 盐是好盐吗?我的注册/登录过程是否存在任何缺陷?,sql-server-2005,hash,guid,salt,Sql Server 2005,Hash,Guid,Salt,如果数据库中的表如下所示: userid uniqueidentifier username varchar(20) password varbinary(max) 当用户提交(注册)时,我将用户/通行证发送到存储过程 存储过程创建一个新的GUID(使用),然后我使用SQL Server的(sha1)函数根据提供的GUID+密码创建密码,然后将值插入上表 当用户提交(登录)时,我将user/pass发送到存储过程 存储过程查找用户名并获取userid,以将guid+password的ha

如果数据库中的表如下所示:

 userid uniqueidentifier
 username varchar(20)
 password varbinary(max)
当用户提交(注册)时,我将用户/通行证发送到存储过程

存储过程创建一个新的GUID(使用),然后我使用SQL Server的(sha1)函数根据提供的GUID+密码创建密码,然后将值插入上表

当用户提交(登录)时,我将user/pass发送到存储过程

存储过程查找用户名并获取userid,以将guid+password的hashbyte(sha1)与password字段进行比较


你认为这种逻辑有什么缺陷吗

这是相当标准的-guid可以作为盐。salt的目的是防止,对于每个用户来说,几乎任何随机的值(或者即使不是随机的,那么至少也是不同的)都会起到作用。

为什么你在不理解的情况下发明登录

  • 做任何与加密相关的事情都很难。我们其他人更糟
  • 有大量现成的认证系统可免费使用。几乎所有这些都会比你自己做的更好,更灵活
  • 根据评论中问题的新详细信息进行更新。对于与SQL Server对话的Windows GUI应用程序,我的身份验证选择将从以下内容开始:

  • 域身份验证(简单,但需要域)
  • 。不难,非常灵活,但需要客户端基础架构
  • SQL Server混合模式身份验证(简单但不灵活)
  • via(更难,但非常可配置)
    如前所述,不清楚该机制是如何工作的-我假设
    userid
    字段包含生成的GUID(否则我看不到如何检索它进行比较)


    有不同的,不是所有的都是随机的。但是,随机性并不是密码加密所必需的。总而言之,你的方法看起来不错,尽管你可以考虑多次执行哈希来进一步提高安全性。

    < P>正如Craig Stuntz所指出的,你不应该试图自己做密码。对盐的蔑视是不公平的。正如它所说的,这应该是随机的,而且您的GUID可能不是随机的,因此您可能会有信息泄漏,并降低安全性。也就是说,这取决于您希望系统具有多大的安全性。如果这不是一个大型应用程序,那么您可以使用当前的系统。

    如果安全性是首要考虑的问题,我不希望对salt值使用GUID

    GUID有不同的“类型”,有些类型比其他类型更“随机”。然而,即使是最好的GUID类型(从“随机性”的角度来看,这将是V4类型的GUID)也不真正适合于加密函数

    从:

    V4 guid使用更晚的算法, 这是一个伪随机数。这些 在同一位置有一个“4”,例如 例子 {38a52be4-9352-453e-af97-5c3b448652f0}。 更具体地说,“data3”位 模式应为000XXXXXXXXXX英寸 第一个案例,以及0100xxxxxxxxxxx 在第二个密码分析 WinAPI GUID生成器显示, 因为V4 guid的顺序是 伪随机,给定初始状态 人们可以预测未来25万人 函数返回的GUID uuiddreate。这就是为什么使用guid 不应用于密码学,例如。 g、 ,作为随机键。


    我想你指的是盐的作用。此外,它必须看起来是随机的,但对于每个用户来说是唯一的和静态的(否则你怎么检查它呢?),salt的目的是防止彩虹表攻击。对于这一点,值甚至不必是随机的,只是每个用户都不同。但是你能指出OP写的东西中的一个实际缺陷吗?我的意思是,他不是在使用散列函数之类的东西,而是在使用密码散列。这是一件很常见的事情,与“不要使用自己的安全功能”的建议相去甚远。Kenny,“nonce”和“nuance”是两件完全不同的事情。我说的是真的。能举个你所说的免费的好例子吗?我想我可以查一下,但我今天觉得很懒;)@克雷格·斯特恩茨:我不确定我是否明白你的观点(至少在这个问题上)。对密码哈希进行加密与加密无关。应用程序的其他部分并不是讨论的一部分,问题也不是“如何实现坚如磐石的登录过程”。@Craig Stuntz:当然是相关的,比如“属于该类别”。但正如我所说,从对密码进行散列/加密到编写自己的加密/散列函数还有很长的路要走。前者是利用现有的基础设施做一些普通的事情。没关系。后者应该留给专家来处理。它将使用sql server 2005中的newid()。salt的随机性不是为了安全,而是为了避免性能受到影响而检查冲突。一种盐所需要的就是它的独特性。伪随机是好的,只要它很有可能是唯一的。也就是说,如果给定选项,请尽可能使用加密强度RNG。有趣的是,由于guid用于salt值,这是否真的会导致不安全?生成salt的机制不需要是随机的或不可预测的,以实现salt的目的。嗯,使用的盐值的任何可预测性都将削弱整体安全性。理想情况下,每个salt值都应该是唯一随机的,并且(理想情况下)与任何其他salt值都没有相关性/可预测性,以及完整的salt值数据集。@CraigTP没有人说过使用相同的salt。GUID的彩虹表有多大?是的,它将是生成的GUID,我将使用sql server 2005中的NEWID()