(完全披露:我已经是这里和 StackOverflow 的积极参与者,但出于希望显而易见的原因,我选择匿名提出这个特定问题)。
我目前在一家小型软件商店工作,该商店生产商业销售的软件,以管理几个相当专业的行业的中小型企业。因为这些行业是面向客户的,所以大部分软件都与存储和管理客户信息有关。特别是客户信用卡信息的存储(和保护)。当然,随之而来的是 PCI 合规性。
长话短说,我还有几个问题是关于为什么某些事情会以这种方式完成,不幸的是,我目前没有太多资源。这是一家很小的商店(我直接向老板汇报,唯一的其他全职员工也是如此),而老板对这些问题没有答案,之前的开发人员是......呃......不可用。
问题 1:定期重新加密
到目前为止,如果以下任一条件为真,该软件会提示用户对数据库中的所有敏感信息(基本上是信用卡号和用户密码)进行全面重新加密:
数据库中有任何未加密的敏感信息片段(例如,通过手动数据库语句而不是通过业务对象添加)。在软件的正常使用过程中不应发生这种情况。
当前密钥已使用超过特定时间段。我相信这是12个月,但我不确定。这里的重点是密钥“过期”。
这是我第一次涉足与 PCI 相关的商业解决方案开发,因此很遗憾我没有受过相关实践方面的教育。PCI 合规性的某些方面是否要求(甚至强烈建议)定期更新密钥?
这对我来说不是一个大问题,除了如果他们问为什么提示他们运行它,我目前没有很好的解释给最终用户。
问题 1:密钥到期标准的概念是标准吗?如果是,那仅仅是行业标准还是 PCI 的一个元素?
问题 2:密钥存储
这是我真正的问题......加密密钥存储在数据库中,只是被混淆了。密钥在左右两侧填充了一些垃圾字节,一些位被扭曲,但基本上没有什么能阻止有进取心的人检查我们的(dotfuscated)代码,确定用于将存储的密钥转换为真实密钥的模式,然后使用该键运行 amok。这对我来说似乎是一种可怕的做法,但我想确保这不仅仅是这个行业的人们所采取的那些“笑着忍受”的做法之一。我开发了一种替代方法来防止此类攻击,但我只是在这里寻找健全性检查。
问题2:这种密钥存储方法——即使用客户端代码中存在的混淆方法将密钥存储在数据库中——是正常的还是疯狂的?
相信我,我知道免费建议值得我为此付出的每一分钱,这里没有人是律师(或者至少不提供法律建议)、买主等,但我正在寻找对于你们都可以提供的任何输入。先感谢您!