我需要将密码加salt转换为256位哈希。散列用作加密/解密iPhone上的数据库的密钥,因此它永远不需要在电话之外生成。它也不需要移动到不同的iPhone。目前,我们使用了一个标准的哈希函数多轮,使蛮力攻击很难。
我想让iPhone的安全飞地参与到这个过程中,希望让它更安全。然而,功能非常有限:我可以生成一个椭圆曲线私钥对/公钥对,我可以加密/解密,我可以生成或验证一个ECC签名。
我生成哈希的想法是:生成ECC私钥/公钥对;忽略公钥。取密码和salt,然后使用ECC键反复计算100 ms的数据签名(迭代次数很低,因为安全的飞地很慢)。然后使用一些标准的加密安全哈希函数将结果转换为我需要的哈希。
PS。评论说签名不一定是唯一的。例如,我想它可以用随机数据填充。因为我想要的只是一个随机的,但确定性的位模式,所以最好用确定性填充填充密码+ salt,然后加密。但仍不确定这是否具有确定性。
你觉得这安全吗?
最大的问题是反复计算签名是否会失去熵。不应该,但我所做的并不是一个典型的用例,签名算法的设计者可能每一轮都会损失2位熵。正常用例仍然有254位熵。您认为此方法会生成2^256个可能的密钥吗?
另一个反对意见是,攻击者可能会获取公钥并以某种方式使用它们来撤消签名计算。当然,仅仅是因为公钥被称为“公共的”,除非有人公开,否则它们是不公开的。
(如果没有人反对,那么这个方法应该是相当安全的。对私钥的引用存储在密钥链中;要获得私钥,攻击者必须解锁手机,并安装一个带有来自我公司的伪造或被盗签名的应用程序。然后,他们将不得不强行在iPhone上的密钥,因为私钥不能从安全飞地中删除,失去了使用强大硬件的能力)。
PS。我从来没有想到过,但是在iPhone安全飞地中使用相同的键为字符串"abcdef“生成10个签名实际上产生了10个不同的签名:-(所以不管我的想法是否好,它都不起作用。
发布于 2017-08-12 16:11:14
您可以简单地创建一个数据库/ enclave特定(对称)密钥,并使用Enclave密钥对对该密钥进行加密。您可以通过解密来取回包装好的密钥。
可以像现在这样简单地计算密码派生的密钥。
所以剩下的就是将这些键组合回一个依赖于两者的单一键。你可以简单地把钥匙放在一起。或者您可以将它们连接起来,然后使用一个KBKDF (最简单的形式可能只是一个散列算法)来派生一个新的数据密钥。
您还可以将salt和未包装的键连接在一起,并将其用作salt输入。这种组合称为盐和胡椒,其中胡椒是输入的秘密部分.这样,派生的密钥既取决于秘密,也取决于密码。
然后,可以使用派生数据键来保护数据库。
如果不希望数据库被攻击者破坏,请不要忘记添加身份验证。
https://crypto.stackexchange.com/questions/50792
复制相似问题