存储加密的 PEM 块安全吗?
Is it safe storing an encrypted PEM block?
我有一些使用 Go 的经验,但现在我不太了解我所做的安全性的复杂性,所以我需要问一下。
我正在创建一个 RSA 私钥,将其转换为 PEM,然后使用密码对其进行加密。
那么,将它存储在 public 地方有多安全?
我不是在寻找像 "it's ok, just change the passphrase over time" 这样的答案,我真的想知道 Golang 正在使用哪种密码机制来做到这一点,以及将加密的 PEM 留在例如 public 区块链以及为什么我能做到或为什么不能。
我将在这里留下我现在正在使用的代码:
func New(passphrase string)(*pem.Block, error){
pk, err := createPrivateKey(2048)
if err != nil {
return false, err
}
pem := getPemFromPK(pk)
block, err := EncryptPEMBlock(pem,passphrase)
if err != nil {
return false, err
}
return block,nil
}
func createPrivateKey(bits int) (*rsa.PrivateKey, error){
pk, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return nil, err
}
return pk,nil
}
func getPemFromPK(pk *rsa.PrivateKey) (*pem.Block){
block := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(pk),
}
return block
}
func EncryptPEMBlock(block *pem.Block, passphrase string) (*pem.Block, error){
block, err := x509.EncryptPEMBlock(rand.Reader, block.Type, block.Bytes, []byte(passphrase), x509.PEMCipherAES256)
if err != nil {
return nil, err
}
return block,nil
}
非常感谢。
编辑:
作为此处和其他论坛的答案,不建议在 public 中发布任何类型的私钥,即使已加密。
此主题已回答。
你在思考什么是私钥和什么是密码时犯了错误。密码用于加密和解密您的私钥 - 如果您正在存储需要使用密码的密钥文件,那么该文件包含您的 encrypted 密钥。
如果你像你说的那样存储 "private key",听起来你希望 public只存储未加密的密钥。但是,即使您在 public 在线存储库上发布了加密的私钥,也有很多方法可以破解密码。如果密码短语很短或以其他方式不安全,则攻击者现在拥有您的私钥。如果他们以您为目标并获得对您在应用程序中使用此密钥的机器的访问权限(即 bash),那么他们只需访问 bash 历史日志即可找到密码。
实际上,有时在有针对性的攻击中对某人进行键盘记录是微不足道的。
如果您在线存储未加密的私钥,很多事情都可能出错。
我有一些使用 Go 的经验,但现在我不太了解我所做的安全性的复杂性,所以我需要问一下。
我正在创建一个 RSA 私钥,将其转换为 PEM,然后使用密码对其进行加密。
那么,将它存储在 public 地方有多安全?
我不是在寻找像 "it's ok, just change the passphrase over time" 这样的答案,我真的想知道 Golang 正在使用哪种密码机制来做到这一点,以及将加密的 PEM 留在例如 public 区块链以及为什么我能做到或为什么不能。
我将在这里留下我现在正在使用的代码:
func New(passphrase string)(*pem.Block, error){
pk, err := createPrivateKey(2048)
if err != nil {
return false, err
}
pem := getPemFromPK(pk)
block, err := EncryptPEMBlock(pem,passphrase)
if err != nil {
return false, err
}
return block,nil
}
func createPrivateKey(bits int) (*rsa.PrivateKey, error){
pk, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return nil, err
}
return pk,nil
}
func getPemFromPK(pk *rsa.PrivateKey) (*pem.Block){
block := &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(pk),
}
return block
}
func EncryptPEMBlock(block *pem.Block, passphrase string) (*pem.Block, error){
block, err := x509.EncryptPEMBlock(rand.Reader, block.Type, block.Bytes, []byte(passphrase), x509.PEMCipherAES256)
if err != nil {
return nil, err
}
return block,nil
}
非常感谢。
编辑:
作为此处和其他论坛的答案,不建议在 public 中发布任何类型的私钥,即使已加密。
此主题已回答。
你在思考什么是私钥和什么是密码时犯了错误。密码用于加密和解密您的私钥 - 如果您正在存储需要使用密码的密钥文件,那么该文件包含您的 encrypted 密钥。
如果你像你说的那样存储 "private key",听起来你希望 public只存储未加密的密钥。但是,即使您在 public 在线存储库上发布了加密的私钥,也有很多方法可以破解密码。如果密码短语很短或以其他方式不安全,则攻击者现在拥有您的私钥。如果他们以您为目标并获得对您在应用程序中使用此密钥的机器的访问权限(即 bash),那么他们只需访问 bash 历史日志即可找到密码。
实际上,有时在有针对性的攻击中对某人进行键盘记录是微不足道的。
如果您在线存储未加密的私钥,很多事情都可能出错。