Leo*_*tov 6 javascript ruby encryption aes sjcl
嗨,假设客户端有一个密钥不通过与加密数据相同的通道传输.
我想要完成的是在ruby中解密Stanford Javascript Crypto Library(sjcl)的结果.或者用于具有支持AES的加密库的任何其他语言的泛化.
这是我在javascript中所做的:
sjcl.encrypt('stack-password', 'overflow-secret')
Run Code Online (Sandbox Code Playgroud)
这就是我得到的回报:
{
"iv": "Tbn0mZxQcroWnq4g/Pm+Gg",
"v": 1,
"iter": 1000,
"ks": 128,
"ts": 64,
"mode": "ccm",
"adata": "",
"cipher": "aes",
"salt": "pMQh7m9Scds",
"ct": "H6JRpgSdEzKUw2qEO1+HwIzAdxGTgh0"
}
Run Code Online (Sandbox Code Playgroud)
所以我实际要问的是,我需要哪些参数(假设服务器已经有"stack-password"密钥)以便解密秘密服务器端,我应该使用哪个库?可能有AES解密库是不够的?
以下内容无法协商(或硬编码).
ct:显然,密码加密数据iv:初始化向量,应该是唯一的,不能与AES-CCM使用相同的密钥重用salt:random,用于通过Pbkdf2从密码创建密钥adata:其他经过身份验证的数据,是您要包含的纯文本数据,但确保在使用AES-CCM时未被篡改.如果您不打算包含任何数据,那么您可以忽略它(您必须使用sjcl中的明文传递它).以下您可以协商一个时间段(或硬编码),实际上您不应该在服务器加密api中插入这些值,当传输未经身份验证并期望安全性时.adata不会是一个不好的地方v,iter或者ks如果你想让它基于客户多变
iter:Pbkdf2的迭代,这只需要足够高,以减慢你的密码的暴力需要随着未来的硬件速度而改变.ks:keysize知道使用Pbkdf2生成什么大小的密钥,需要随着将来的安全量而改变ts:tagsize以了解认证标记的大小是密文的一部分cipher:如果您只支持AES,那么您可以假设.mode:如果你只支持AES-CCM,那么你可以假设.v:如果你将来只支持一个版本的sjcl,那么你可以假设.使用OpenSSL库的 ruby 似乎只要你的OpenSSL支持AES-128-CCM puts OpenSSL::Cipher.ciphers检查它就可以工作.它确实支持使用pbkdf2生成密钥,但是你需要使用Sha256摘要与sjcl兼容,而sjcl又取决于你的openssl版本.
对于那些来自 Google 的人,我设法使用 sjcl 库在 Appcelerator 的 Titanium 上加密并在 Ruby/Rails 上解密。
加密(JavaScript):
var data = SJCL.encrypt('your key here',
'plain text',
{ mode: 'gcm',
iv: SJCL.random.randomWords(3, 0) });
Run Code Online (Sandbox Code Playgroud)
重要的是使用较小的 IV。
解密(红宝石):
def self.decrypt(h)
h = HashWithIndifferentAccess.new(JSON.parse(h))
key = OpenSSL::PKCS5.pbkdf2_hmac('your key here', Base64.decode64(h[:salt]), 1000, h[:ks]/8, 'SHA256')
puts "Key: #{key.unpack('H*')}"
puts "Salt: #{Base64.decode64(h[:salt]).unpack('H*')}"
c = OpenSSL::Cipher.new("#{h[:cipher]}-#{h[:ks]}-#{h[:mode]}")
c.decrypt
c.key = key
c.iv = Base64.decode64(h[:iv])
puts "IV: #{Base64.decode64(h[:iv]).unpack('H*')}"
c.auth_data = ""
c.update(Base64.decode64(h[:ct]))
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2566 次 |
| 最近记录: |