重点是设计一个简单的系统,用户可以在它们之间发送加密消息(在服务器的支持下).
在这种情况下,客户端没有本地存储,因此我不得不使用用户可以选择的密码,记住并在需要时键入.(我知道这削弱了整个系统,但这是一个很难的要求)
另一个要求是,该服务器不能存储明文私钥或可被用来解密消息的任何其它数据(例如:只有用户可以读取加密的消息,服务器管理员不应该能够).
我的方法是在客户端上生成非对称密钥对,在服务器上发布公钥以及私钥的加密副本(使用用户密码加密).然后,用户可以使用收件人发布的公钥将加密邮件发送给其他用户; 当用户需要解密消息时,从服务器上获取客户端上的(加密)私钥,用用户提供的密码解密,然后用于解密消息.
这有意义吗?这个系统设计有什么缺陷吗?(除了用户选择短密码或坏密码导致的弱点)这种方法是否已经在类似场景中使用过?
谢谢 :)
security password-protection public-key-encryption public-key
我提前为传入的Wall-O-Text道歉.这是(至少对我来说)一个相当复杂的问题,我已经考虑了很多.你可以阅读我的问题,也可以在这个GitHub Gist中看到Ruby中的测试实现(非常匆忙构建,而不是数据库支持,可能非常难看).
想象一下,需要创建一个基于Web的密码管理系统(通过SSL!:),具有以下要求:
我不是密码学方面的专家.在考虑了一段时间后,我想出了以下内容. 我的问题是:这种实施安全吗?我错过了什么吗?如果是这样,上述规范是否可以实现?或者这有点矫枉过正?
数据库设置如下:
+------------------------------------------------------------------------------+
| users |
+---------+--------------+--------------+---------------+----------------------+
| salt | pub_key | enc_priv_key | priv_key_hmac | |
+---------+--------------+--------------+---------------+----------------------+
| entries |
+---------+--------------+--------------+---------------+----------+-----------+
| user_id | parent_entry | enc_sym_key | sym_key_sig | enc_data | data_hmac |
+---------+--------------+--------------+---------------+----------+-----------+
Run Code Online (Sandbox Code Playgroud)
让我们想象一下系统的两个用户,Alice和Bob.
鲍勃报名参加该网站:
salt字段中.pub_key字段中以纯文本格式存储.私钥通过AES-256使用Bob的密码和salt生成的哈希作为密钥加密并存储在enc_priv_key字段中.priv_key_hmac字段中.Bob 在系统中存储一个条目:
我需要使用java读取公钥并对其进行解析,以检查其有效性,指数,模数或是否有效.我尝试了以下代码,并遇到了问题.能帮我找到解决这个问题的方法吗?
public static void getPublicKey(String key) throws Exception {
key = key.replaceAll("-----BEGIN SSH2 PUBLIC KEY-----", "");
key = key.replaceAll("-----END SSH2 PUBLIC KEY-----", "");
KeyFactory kFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider());
byte pub_llave[] = new BASE64Decoder().decodeBuffer( key ) ;
X509EncodedKeySpec spec = new X509EncodedKeySpec(pub_llave);
PublicKey pubkey = (PublicKey) kFactory.generatePublic(spec);
}
Run Code Online (Sandbox Code Playgroud)
以下是例外情况:
java.lang.IllegalArgumentException: unknown object in getInstance: org.bouncycastle.asn1.DERApplicationSpecific
at org.bouncycastle.asn1.ASN1Sequence.getInstance(Unknown Source)
at org.bouncycastle.asn1.ASN1Sequence.getInstance(Unknown Source)
at org.bouncycastle.asn1.x509.SubjectPublicKeyInfo.getInstance(Unknown Source)
Run Code Online (Sandbox Code Playgroud) 我有一个让我发疯的问题.
我创建了一对键:
$res = openssl_pkey_new(array('private_key_bits' => 2048));
/* Extract the private key from $res to $privKey */
openssl_pkey_export($res, $privKey);
/* Extract the public key from $res to $pubKey */
$pubKey = openssl_pkey_get_details($res);
$pubKey = $pubKey["key"];
Run Code Online (Sandbox Code Playgroud)
使用此代码,我有$pubKey和$privKey.
我可以正确地加密/解密,但我对DECRYPTION有很大疑问.
目前我的密码数据正在做:
openssl_public_encrypt($data, $encrypted, $pubKey);
Run Code Online (Sandbox Code Playgroud)
它正确加密我的数据,但是阅读PHP Doc,我发现:
http://php.net/manual/en/function.openssl-public-decrypt.php
我可以使用PUBLIC KEY解密数据吗?为什么?
我知道公钥对ENCRYPT数据很有用,但只有私钥的所有者才能解析数据.
如果我可以使用公钥解密数据,那么让知道公钥的用户可以轻松解密这些消息.
有人可以向我解释一下吗?我正在寻找一种方法来使用两个键,第一个是ENCRYPT,第二个(只有第二个)是DECRYPT.
谢谢
我想从PHP生成Chrome扩展程序(Chrome主题).我的PHP脚本生成一个zip文件(download.zip).要将其转换为.crx包,需要添加标头,包括公钥和签名.
我看到了这个答案,但你需要一个生成.pub文件的.pem文件.我在共享主机上,因此exec()将无法工作(将.pem转换为.pub).不需要.pem文件,只需在下载后使用它(无需更新).
然后我看到这条评论说明你可以生成私钥和公钥.组合这两个脚本将不起作用(请参阅代码).
如何生成密钥对并使用它来签署带有PHP的chrome .crx包?
此代码失败(CRX_SIGNATURE_VERIFICATION_INITALIZATION_FAILED):
// Create the keypair
$res=openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $pk);
// Get public key
$key=openssl_pkey_get_details($res);
$key=$key["key"];
# make a SHA1 signature using our private key
openssl_sign(file_get_contents('download.zip'), $signature, $pk, 'sha1');
# decode the public key
$key = base64_decode($key);
# .crx package format:
#
# magic number char(4)
# crx format ver byte(4)
# pub key lenth byte(4)
# signature length byte(4)
# public key string
# signature string
# package …Run Code Online (Sandbox Code Playgroud) 这是我的代码:
EC_KEY *eckey = EC_KEY_new();
EC_KEY_generate_key(eckey);
const EC_POINT *pub = EC_KEY_get0_public_key(eckey);
printf("%s", pub->X);
Run Code Online (Sandbox Code Playgroud)
我收到一条错误,上面写着"类型'struct ec_point_st'的不完整定义".我也尝试过:
EC_GROUP *curve = EC_GROUP_new_by_curve_name(NID_secp521r1);
BN_CTX *ecctx= BN_CTX_new();
EC_KEY *eckey = EC_KEY_new();
EC_KEY_generate_key(eckey);
const EC_POINT *pub = EC_KEY_get0_public_key(eckey);
NSLog(@"%s", EC_POINT_point2hex(curve, pub, POINT_CONVERSION_HYBRID, ecctx));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我收到一个EXC_BAD_ACCESS错误.如何打印(用于调试)公钥的x和y点?
openssl cryptography objective-c cryptoapi public-key-encryption
我正在尝试实现ecc技术进行加密.我浏览了以下帖子:
没有任何令人满意的解决方案.
现在,我正在考虑使用python库
https://github.com/yann2192/pyelliptic
但我不知道这是否是使用ecc进行加密的更好解决方案,因为我仍然需要找到一种在objc中使用python库的方法.
有人能指出我正确的方向吗?
python elliptic-curve public-key-encryption ios commoncrypto
我有一个包含公共RSA密钥的文件(生成时ssh-keygen).我想读取文件并生成一个PublicKey对象.
在此之前我转换了文件,因为阅读原始文件似乎是不可能的:
# http://unix.stackexchange.com/questions/220354/how-to-convert-public-key-from-pem-to-der-format/220356#220356
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PEM > ~/.ssh/id_rsa.pub.pem
openssl rsa -RSAPublicKey_in -in ~/.ssh/id_rsa.pub.pem -inform PEM -outform DER -out ~/.ssh/id_rsa.pub.der -RSAPublicKey_out
Run Code Online (Sandbox Code Playgroud)
从Java - 使用现有公钥文件加密字符串我定义了函数readFileBytes:
public static byte[] readFileBytes(String filename) throws IOException {
Path path = Paths.get(System.getProperty("user.home") + filename);
return Files.readAllBytes(path);
}
Run Code Online (Sandbox Code Playgroud)
现在我想读取文件并生成PublicKey对象,但我找不到办法做到这一点; java.security.spec.RSAPublicKeySpec不提供适合的构造函数并java.security.spec.X509EncodedKeySpec抛出错误java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence:
//RSAPublicKeySpec publicSpec = new RSAPublicKeySpec(readFileBytes("/.ssh/id_rsa.pub.der"));
// No fitting construktor
X509EncodedKeySpec publicSpec = new …Run Code Online (Sandbox Code Playgroud) 保持这个问题具体而且重点突出的新问题.
我有一个来自Azure的JWT,现在我需要在我的应用程序中验证签名.
可以在此处找到Microsoft的公钥:
https://login.windows.net/common/discovery/keys
如何使用这些密钥验证签名?我可以告诉这些是我需要的公钥,因为JWT中的X5T头与此公钥列表中的X5T头匹配.
我正在使用JWT PHP库,但我作为公钥输入的所有内容似乎都失败了.
supplied key param cannot be coerced into a public key
Run Code Online (Sandbox Code Playgroud)
所以使用上面的链接,从那里进入PHP openssl_verify函数作为参数三(下面的例子中的$ key)?
$success = openssl_verify($msg, $signature, $key, 'SHA256')
Run Code Online (Sandbox Code Playgroud)
我输入的所有内容都会以某种方式导致错误.
谢谢,
我正在尝试为自己编写简单的应用程序,当我尝试调用getInfo方法时,我总是会在响应中出错.密钥,符号,方法或随机数不正确.我发现了一些例子,但我仍然在代码中找不到错误.任何人都可以帮我吗?
该代码适用于hitbtc.我知道yobit有点不同,但我想我已经适应了.
我的代码:
Protected Shared Function readStrings(signatureheader As String, host As String, pathandQuery As String, post As String, secret As String, hasher As System.Security.Cryptography.HMAC, otherHeaders As Tuple(Of String, String)()) As String
'apikey=98998BEEB8796455044F02E4864984F4
'secret=44b7659167ffc38bb34fa35b5c816cf5
hasher.Key = exchanges.getBytes(secret)
Dim url = host + pathandQuery ' url = "https://yobit.net/tapi/"
Dim wc = New CookieAwareWebClient()
Dim sigHash2 = ""
If post = "" Then
sigHash2 = CalculateSignature2(pathandQuery, hasher)
Else
'post = "method=getInfo&nonce=636431012620"
sigHash2 = CalculateSignature2(post, hasher) 'sighash2= "ece0a3c4af0c68dedb1f840d0aef0fd5fb9fc5e808105c4e6590aa39f4643679af5da52b97d595cd2277642eb27b8a357793082007abe1a3bab8de8df24f80d2"
End If
wc.Headers.Add(signatureheader, sigHash2) …Run Code Online (Sandbox Code Playgroud) openssl ×5
php ×3
bouncycastle ×2
encryption ×2
java ×2
rsa ×2
security ×2
api ×1
commoncrypto ×1
cryptoapi ×1
cryptography ×1
ios ×1
objective-c ×1
public-key ×1
python ×1
ruby ×1
vb.net ×1