| | | 在Windows中存储秘密数据 | | 2001-09-05·
·青苹果工作室··chinabyte
| 1 2 3 下一页 有一句关于保守秘密的格言:“如果三个人可以保守一个秘密的话,那么其中两人一定是死人。”本文就将讲述计算机系统中的秘密数据处理问题。
开发人员经常问我,在建立安全系统的时候,如何才能安全地存储秘密信息?秘密信息包括只能有一个或多个合法计算机、用户或应用程序知道的数据,比如口令、对其它数据进行解密的关键字等等。本文就介绍解决这种问题的方法,涵盖了一些将秘密存储在不同的Windows平台上的最好方法。
有时候你并不需要存储秘密
如果你存储一个秘密信息的目的只是为了验证另一个实体是否也知道这个秘密信息,那么你可能就不需要存储这个秘密信息本身。反之,你可以存储一个“验证符”,它通常就是这个秘密信息的hash数值。例如,如果应用程序需要验证一个用户的口令值,就可以将用户输入的秘密信息的hash数值与存储秘密信息的hash数值做比较。这样,应用程序并没有存储秘密信息本身,从而引出的风险也要少些:即使攻击者闯入了系统,他们也无法恢复秘密信息本身。
为了给攻击者带来更多困难,你还可以给hash数值加点“盐”。“盐”是一个随即数,将它加到hash数值上以阻止预先计算好的字典式攻击,这样想要恢复原始的秘密信息就非常困难。“盐”与hash数值存储在一起。选择hash函数是一个重要决定,而且一定要使用密码性很强的hash函数,这样的hash函数已经被证明没有冲突的可能,或者是这种可能性相当低。换句话说就是,创建两个能计算出同一hash数值的数据是行不通的。现在最常使用的hash函数是SHA-1。MD5已经有些过时了,因为在其算法中有一些小小的弱点。
现在来看看存储秘密信息的hash数值以及确认秘密信息所需要的步骤:
1、存储加过“盐”的hash数值
- 确定你希望保护的秘密信息。例如:一个用户口令。
- 使用CryptGenRandom()函数生成一个随机的128位数。这就是“盐”。
- 在秘密信息上运行一个hash函数[使用CryptCreateHash()和CryptHashData()]。
- 将盐与hash数值相加[使用CryptHashData()]。
- 存储盐和hash数值。
2、验证用户知道这个秘密信息
- 从用户处取得这个秘密信息。
- 在秘密信息上运行一个hash函数[使用CryptCreateHash()和CryptHashData()]。
- 从存储的位置取得hash数值和盐。
- 将盐添加到hash数值上[使用CryptHashData()]。
- 比较这两个加了盐的数值,如果它们相同,那么说明用户知道这个秘密信息。
你能看到,不用存储秘密信息就能解决问题了,而且这样比存储秘密信息还好。但是有时也必须要存储秘密信息。现在来看看存储秘密信息的一个安全方法。 1 2 3 下一页 | | | 感谢
访问天极网,如果您觉得该文章涉及版权问题,请看这里!
|
|