我正在推出我自己的、个人的、类似于“云中加密数据”的webapp (我不喜欢UI,也没有非浏览器的客户端)。
然而,我绝对没有安全和加密方面的经验,并且在阅读了.NET密码库的三种安全性、维基百科文章和文档之后,拼凑出了这个方案。
在讨论我的方案之前,下面简要介绍一下我如何理解三格安全方案:它们使用从明文用户凭据派生的密钥对客户机上的数据进行加密和解密,并且只向服务器发送加密的数据。对于身份验证,它们使用与明文用户凭据无关的散列。由于从理论上讲,存储在服务器上用于检索数据的凭据不能用于实际解密数据,因此没有人,甚至服务器所有者和客户程序员也不能解密这些数据,除非他们从用户那里获得原始明文凭据。
假设他们有正确的想法,并且这样的设置确实保证了数据的安全(只要用户的密码不被键盘记录器破坏,用户不会在某个地方以明文形式保存密码,等等),我想知道我的实现是否完成了这项工作。
发送加密数据的过程是:
*对于N字节盐,我取我想要的明文的未加盐的SHA-512散列(或者我想提供给接受盐的算法的明文),并从中选择一个确定的N字节子集(例如,对于一个3字节的盐,未加盐的散列的第1、第3和第5字节-对此更好吗?)--字节序列就是我的盐。
如果有关系,我使用的是.NET Framework4,System.Security.Cryptography类。我只编程地为它们的PBKDF2实现指定了回合数,因为这是我看到一个明显的属性/方法来设置它的唯一情况。不过,我认为这一级别的细节对于Stack溢出来说是个问题。
无论如何,我更关心的是绝对的、概念性的安全性,而不是快速计算,但我也很乐意接受任何提高效率的建议(如果我做的任何事情都是多余的)。
发布于 2011-07-23 07:13:26
“我绝对没有安全和加密方面的经验。”考虑到这句话,如果安全性对您的应用程序很重要,那么设计新的密码方案可能不是最好的主意。密码系统的设计是一个棘手的课题。那些试图在不了解该领域的情况下自行发明计划的人,往往会犯一些不明显的错误。如果我能用一个比喻,我就不会试图给自己做手术,我会去找一位合格的外科医生。如果安全性很重要,您也应该这样做。
关于您的计划:它肯定有一些积极的方面,但也有一些我发现的重大缺点(不能保证这个列表是详尽无遗的):
即使您修复了所有这些问题,也不能保证结果是充分安全的。一般来说,如果对一个设计的初步审查表明有4个问题,即使你解决了你所知道的问题,人们也应该非常怀疑:你怎么知道没有第五个问题是你刚刚错过的?
也就是说,在你的设计中也有一些积极的因素。例如,您正在使用标准的经过良好审查的算法,这是很好的。总的来说,我认为你走在一条合理的道路上--有些不明显的问题你可能没有预料到。
https://security.stackexchange.com/questions/5563
复制相似问题