标签: public-key-encryption

使用用户选择的密码进行公钥加密?

重点是设计一个简单的系统,用户可以在它们之间发送加密消息(在服务器的支持下).

在这种情况下,客户端没有本地存储,因此我不得不使用用户可以选择的密码,记住并在需要时键入.(我知道这削弱了整个系统,但这是一个很难的要求)

另一个要求是,该服务器不能存储明文私钥或可被用来解密消息的任何其它数据(例如:只有用户可以读取加密的消息,服务器管理员不应该能够).

我的方法是在客户端上生成非对称密钥对,在服务器上发布公钥以及私钥的加密副本(使用用户密码加密).然后,用户可以使用收件人发布的公钥将加密邮件发送给其他用户; 当用户需要解密消息时,从服务器上获取客户端上的(加密)私钥,用用户提供的密码解密,然后用于解密消息.

这有意义吗?这个系统设计有什么缺陷吗?(除了用户选择短密码或坏密码导致的弱点)这种方法是否已经在类似场景中使用过?

谢谢 :)

security password-protection public-key-encryption public-key

6
推荐指数
1
解决办法
234
查看次数

创建一个安全的,基于Web的密码管理系统,能够在用户之间共享数据

我提前为传入的Wall-O-Text道歉.这是(至少对我来说)一个相当复杂的问题,我已经考虑了很多.你可以阅读我的问题,也可以在这个GitHub Gist中看到Ruby中的测试实现(非常匆忙构建,而不是数据库支持,可能非常难看).


介绍

想象一下,需要创建一个基于Web的密码管理系统(通过SSL!:),具有以下要求:

  1. 个人用户使用他们自己的唯一密码短语登录系统.
  2. 这个密码短语应该足以让用户有效地使用系统(例如从智能手机等) - 关键是他们不应该用它们保存密钥文件.
  3. 用户可以在系统中存储任意长度的数据位("条目").
  4. 条目在数据库中加密,使得数据库或应用程序中没有足够的信息来读取加密的条目.
  5. 用户应该能够与系统的其他用户"共享"条目,以便其他用户可以读取条目的内容.

我不是密码学方面的专家.在考虑了一段时间后,我想出了以下内容. 我的问题是:这种实施安全吗?我错过了什么吗?如果是这样,上述规范是否可以实现?或者这有点矫枉过正?

数据库

数据库设置如下:

+------------------------------------------------------------------------------+
|  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字段中.
  • 服务器生成Bob的密码和salt的SHA-256哈希值.
  • 服务器生成RSA密钥对.公钥在pub_key字段中以纯文本格式存储.私钥通过AES-256使用Bob的密码和salt生成的哈希作为密钥加密并存储在enc_priv_key字段中.
  • 服务器使用Bob的密码和salt作为密钥为Bob的私钥生成基于哈希的消息认证代码,并将其存储在priv_key_hmac字段中.

Bob 在系统中存储一个条目:

  • Bob输入一些数据作为条目和密码存储.此数据将发送到服务器.
  • 服务器生成一个密钥,用作AES-256加密的密钥.
  • 服务器使用此密钥加密数据并将结果存储在 …

ruby security encryption openssl public-key-encryption

6
推荐指数
1
解决办法
863
查看次数

解析并读取java中的公钥

我需要使用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)

java bouncycastle public-key-encryption

6
推荐指数
1
解决办法
5001
查看次数

使用PHP进行非对称加密

我有一个让我发疯的问题.

我创建了一对键:

$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 openssl public-key-encryption

6
推荐指数
2
解决办法
7220
查看次数

从PHP生成Chrome .crx

我想从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)

php openssl public-key-encryption google-chrome-extension

6
推荐指数
1
解决办法
927
查看次数

OpenSSL:打印EC_POINT的X和Y.

这是我的代码:

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

6
推荐指数
1
解决办法
4269
查看次数

在ios中使用ecc进行加密

我正在尝试实现ecc技术进行加密.我浏览了以下帖子:

  1. 基于椭圆曲线Diffie-Hellman和CommonCrypto的共享秘密

  2. iOS中的椭圆曲线加密

没有任何令人满意的解决方案.

现在,我正在考虑使用python库
https://github.com/yann2192/pyelliptic

但我不知道这是否是使用ecc进行加密的更好解决方案,因为我仍然需要找到一种在objc中使用python库的方法.

有人能指出我正确的方向吗?

python elliptic-curve public-key-encryption ios commoncrypto

6
推荐指数
1
解决办法
836
查看次数

如何从Java中的文件生成PublicKey对象

我有一个包含公共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)

java encryption rsa bouncycastle public-key-encryption

6
推荐指数
1
解决办法
5783
查看次数

如何使用公共RSA密钥验证JSON Web令牌?

保持这个问题具体而且重点突出的新问题.

我有一个来自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)

我输入的所有内容都会以某种方式导致错误.

谢谢,

php openssl rsa public-key-encryption

6
推荐指数
1
解决办法
2599
查看次数

YoBit tapi验证问题

我正在尝试为自己编写简单的应用程序,当我尝试调用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)

vb.net api public-key-encryption

6
推荐指数
1
解决办法
1416
查看次数