我建议添加一个新字段“ hash_method”,也许用1表示旧方法,用2表示新方法。
合理地说,如果您关心这种事情并且您的应用程序的寿命相对较长(显然已经存在),那么由于密码学和信息安全领域是一个不断发展的,不可预测的领域,这种情况很可能会再次发生。曾经有一次,如果根本不使用哈希,那么通过MD5进行简单运行是标准的!然后可能会认为他们应该使用SHA1,现在出现了加盐,全局盐+单个随机盐,SHA3,不同的加密就绪随机数生成方法...这不会只是“停止”,所以您可能会并以可扩展,可重复的方式解决此问题。
所以,现在假设您有类似的东西(为简单起见,我希望使用伪JavaScript):
var user = getUserByID(id);
var tryPassword = hashPassword(getInputPassword());
if (user.getPasswordHash() == tryPassword)
{
// Authenticated!
}
function hashPassword(clearPassword)
{
// TODO: Learn what "hash" means
return clearPassword + "H@$I-I";
}
现在意识到有一个更好的方法,您只需要进行少量重构即可:
var user = getUserByID(id);
var tryPassword = hashPassword(getInputPassword(), user.getHashingMethod());
if (user.getPasswordHash() == tryPassword)
{
// Authenticated!
}
function hashPassword(clearPassword, hashMethod)
{
// Note: Hash doesn't mean what we thought it did. Oops...
var hash;
if (hashMethod == 1)
{
hash = clearPassword + "H@$I-I";
}
else if (hashMethod == 2)
{
// Totally gonna get it right this time.
hash = SuperMethodTheNSASaidWasAwesome(clearPassword);
}
return hash;
}
在生成此答案时,没有秘密代理或程序员受到伤害。