(对于这个问题,假设我只需要支持 SQL Server 2008 及更高版本。或者为了让这个问题过时,比如说最近的、当前的和近期的版本。)
该声明的文档CREATE LOGIN
说(强调我的):
HASHED 仅
适用于 SQL Server 登录。指定在 PASSWORD 参数之后输入的密码已经过散列。如果未选择此选项,则作为密码输入的字符串在存储到数据库之前会经过哈希处理。此选项应仅用于将数据库从一台服务器迁移到另一台服务器。不要使用 HASHED 选项来创建新的登录。HASHED 选项不能与 SQL Server 7 或更早版本创建的哈希一起使用。
没有解释为什么不应该使用这个选项来创建新的登录,如果有原因,这并不明显(至少对我来说)。
该文档引用了 KB918992,虽然有点不清楚,但描述了指示旧版(2000-2008 R2)密码哈希自动升级的步骤。因此,我可以获取在 2000-2008 R2 和CREATE LOGIN ... WITH PASSWORD ... HASHED
2012(+?)上生成的密码哈希,并在主体第一次登录时将哈希转换为 2012 格式。我测试过这确实像描述的那样工作。
密码哈希本身似乎有一个 6 字节的签名/元数据标头,由我认为是 2 字节的标签/版本和 4 字节的盐组成。升级哈希时,标签/版本会增加,而盐保持不变。
那么问题是:如果微软已经融入了这种未来的兼容性(我认为未来需要维护),那么有什么理由不应该使用这种方法来创建新的登录名?