James
James

Reputation: 82096

How to store public/private key securely

Looking to store public/private key information securely on an iOS device. I know I want to store this in the KeyChain however I am not 100% sure what sort of attributes I need to populate in the SecRecord. I was going to do something like:

// private key
SecKeyChain.Add(new SecRecord(SecKind.Key)
{
    Accessible = SecAccessible.AlwaysThisDeviceOnly,
    KeySizeInBits = 512,
    KeyClass = SecKeyClass.Private,
    CanSign = true,
    ValueData = privateKeyValue,
    Account = publicKeyValue
});

Which would store the private key, then follow a similar approach for the public key replacing the Account attribute with a value unique to the user e.g. username. However, not sure if this is the right way to use this.

Does anyone have a good examples on how you would do this specifically for keys?

Upvotes: 6

Views: 1058

Answers (1)

James
James

Reputation: 82096

Decided to go with the following approach:

// store public key
SecKeyChain.Add(new SecRecord(SecKind.Key)
{
    ApplicationLabel = userName,
    Accessible = SecAccessible.AlwaysThisDeviceOnly,
    KeySizeInBits = 512,
    KeyClass = SecKeyClass.Public,
    ValueData = NSData.FromString(publicKey)
});

// store private key
SecKeyChain.Add(new SecRecord(SecKind.Key)
{
    ApplicationLabel = publicKey,
    Accessible = SecAccessible.AlwaysThisDeviceOnly,
    KeySizeInBits = 512,
    KeyClass = SecKeyClass.Private,
    CanSign = true,
    ValueData = NSData.FromString(secretKey)
});

This means each public key is mapped to an individual user and each private key is mapped to a public key which allows me to store multiple user keys (rather than only storing current logged in users).

Seems to work ok, however, still not 100% sure it is the correct way to do this kind of thing so some clarification would be nice.

Upvotes: 4

Related Questions