క్రిప్టో-JSని అప్డేట్ చేసిన తర్వాత మీ ఎన్క్రిప్షన్ ఎందుకు విచ్ఛిన్నమవుతోంది
దీన్ని ఊహించండి: మీరు మీ ప్రాజెక్ట్లో లైబ్రరీని అప్డేట్ చేసారు, సున్నితమైన కార్యాచరణ మరియు మెరుగైన భద్రతను ఆశించారు. బదులుగా, మీరు ఒకసారి సంపూర్ణంగా పనిచేసే ఎన్క్రిప్షన్ అకస్మాత్తుగా విఫలమైనప్పుడు గందరగోళం చెలరేగుతుంది. ఇది పని చేస్తున్న చాలా మంది డెవలపర్లకు నిరాశ కలిగించే వాస్తవం , ముఖ్యంగా గుప్తీకరించిన డేటాను అంతటా నిర్వహించేటప్పుడు మరియు .
ఈ సందర్భంలో, మీ అప్డేట్ చేయబడిన ఫ్రంటెండ్ మరియు మీ మధ్య ఎన్క్రిప్టెడ్ స్ట్రింగ్లు ఎలా ప్రాసెస్ చేయబడతాయి అనే తేడాల నుండి సవాలు వస్తుంది బ్యాకెండ్. డెవలపర్లు తల గోక్కుంటూ, "తప్పుగా రూపొందించబడిన UTF-8" వంటి లోపాలు తరచుగా పెరుగుతాయి. ఈ సమస్యలు సురక్షిత కమ్యూనికేషన్లపై ఆధారపడే అప్లికేషన్లలో డేటా యొక్క అతుకులు లేని ప్రవాహానికి అంతరాయం కలిగిస్తాయి. 🚧
గుప్తీకరణ పారామితులు లేదా నిర్వహణ పద్ధతుల్లో అసమతుల్యత అత్యంత సాధారణ మూల కారణాలలో ఒకటి. ఉదాహరణకు, క్రిప్టో-JS ప్యాడింగ్ లేదా కీ డెరివేషన్ను హ్యాండిల్ చేసే విధానంలో మార్పులు అననుకూల ఎన్క్రిప్టెడ్ స్ట్రింగ్లకు దారితీయవచ్చు. అందుకే డీబగ్గింగ్ మరియు ట్రబుల్షూటింగ్ మీ కోడ్బేస్ ద్వారా దెయ్యాన్ని వెంబడించినట్లు అనిపిస్తుంది.
ఈ కథనంలో, మేము క్రిప్టో-JS, దాని నవీకరించబడిన సంస్కరణలతో కూడిన వాస్తవ-ప్రపంచ దృష్టాంతంతో మరియు ఈ నిరాశపరిచే లోపాలను ఎలా పరిష్కరించాలో మరియు ఎలా పరిష్కరించాలో ఈ ఖచ్చితమైన సమస్యను విశ్లేషిస్తాము. మీ ఫ్రంటెండ్ మరియు బ్యాకెండ్ మళ్లీ చక్కగా ప్లే చేయడానికి మీరు పోరాడుతూ ఉంటే, మీరు సరైన స్థానంలో ఉన్నారు! 🔐
ఆదేశం | ఉపయోగం యొక్క ఉదాహరణ |
---|---|
CryptoJS.PBKDF2 | పాస్ఫ్రేజ్ మరియు ఉప్పు నుండి సురక్షిత ఎన్క్రిప్షన్ కీని పొందేందుకు ఉపయోగించబడుతుంది. బహుళ పునరావృతాలతో హ్యాషింగ్ ద్వారా బలమైన కీ ఉత్పత్తిని నిర్ధారిస్తుంది. |
CryptoJS.AES.encrypt | పేర్కొన్న మోడ్ మరియు పాడింగ్తో AESని ఉపయోగించి సాదా వచనాన్ని గుప్తీకరిస్తుంది. ఎన్క్రిప్టెడ్ సైఫర్టెక్స్ట్ ఆబ్జెక్ట్ను అవుట్పుట్ చేస్తుంది. |
CryptoJS.AES.decrypt | AES-ఎన్క్రిప్టెడ్ సైఫర్టెక్స్ట్ని తిరిగి దాని సాదా వచన రూపానికి డీక్రిప్ట్ చేస్తుంది. సరిపోలే కీ, IV మరియు మోడ్ సెట్టింగ్లు అవసరం. |
CryptoJS.enc.Base64 | సులభంగా ప్రసారం చేయడానికి లేదా నిల్వ చేయడానికి గుప్తీకరించిన డేటాను Base64కి మారుస్తుంది. సిస్టమ్ల మధ్య అనుకూలత కోసం తరచుగా ఉపయోగించబడుతుంది. |
IvParameterSpec | CTR మోడ్లో AES కోసం కీలకమైన ఎన్క్రిప్షన్ లేదా డిక్రిప్షన్ ఆపరేషన్ల కోసం ఇనిషియలైజేషన్ వెక్టర్ (IV)ని పేర్కొనడానికి జావాలో ఉపయోగించబడుతుంది. |
SecretKeySpec | జావా క్రిప్టోగ్రాఫిక్ లైబ్రరీతో అనుకూలతను నిర్ధారిస్తూ, AES ఎన్క్రిప్షన్ కోసం బైట్ శ్రేణిని రహస్య కీగా మారుస్తుంది. |
Cipher.getInstance | క్రిప్టోగ్రాఫిక్ కార్యకలాపాల కోసం నిర్దిష్ట అల్గోరిథం, మోడ్ మరియు పాడింగ్తో కాన్ఫిగర్ చేయబడిన సైఫర్ ఆబ్జెక్ట్ను తిరిగి పొందుతుంది. |
Cipher.init | కావలసిన మోడ్ (ఎన్క్రిప్ట్ లేదా డీక్రిప్ట్), కీ మరియు ఆపరేషన్ల కోసం ఇనిషియలైజేషన్ వెక్టర్తో సైఫర్ని ప్రారంభిస్తుంది. |
Base64.getDecoder().decode | Base64 ఎన్కోడ్ చేసిన స్ట్రింగ్ని దాని అసలు బైట్ శ్రేణికి తిరిగి డీకోడ్ చేస్తుంది, ఎన్కోడ్ చేసిన ఎన్క్రిప్షన్ కీలు లేదా సైఫర్టెక్స్ట్లను ప్రాసెస్ చేయడానికి ఇది అవసరం. |
క్రిప్టో-JSతో ఫ్రంటెండ్ మరియు బ్యాకెండ్ ఎన్క్రిప్షన్ను మాస్టరింగ్ చేయండి
ఆధునిక అనువర్తనాల్లో ఎన్క్రిప్షన్ అనేది ఒక ముఖ్యమైన భాగం, దీని మధ్య ప్రయాణిస్తున్నప్పుడు సున్నితమైన డేటా సురక్షితంగా ఉండేలా చూసుకోవడం మరియు . సురక్షిత ఎన్క్రిప్షన్ మరియు డిక్రిప్షన్ను సాధించడానికి ఫ్రంటెండ్లో క్రిప్టో-జెఎస్ మరియు బ్యాకెండ్లో జావా ఎలా ఉపయోగించాలో పై స్క్రిప్ట్లు ప్రదర్శిస్తాయి. ఉదాహరణకు, ఫ్రంటెండ్లో, మేము క్రిప్టోగ్రాఫిక్ కీని ఉపయోగించి రూపొందించాము పద్దతి, ఇది పాస్ఫ్రేజ్ మరియు ఉప్పును బహుళ పునరావృతాలతో మిళితం చేస్తుంది. ఈ ఉత్పన్నమైన కీ బ్రూట్-ఫోర్స్ దాడులను చాలా కష్టతరం చేయడం ద్వారా బలమైన భద్రతను నిర్ధారిస్తుంది. 🔒
ఫ్రంటెండ్లో, ఎన్క్రిప్షన్ ఫంక్షన్ సాదాపాఠాన్ని సురక్షితంగా గుప్తీకరించడానికి CTR మోడ్లో AES అల్గారిథమ్ను ఉపయోగిస్తుంది. ఇది ఇనిషియలైజేషన్ వెక్టర్ (IV)ని కలిగి ఉంటుంది మరియు సమర్థవంతమైన ప్రాసెసింగ్ కోసం పాడింగ్ను నివారిస్తుంది. నెట్వర్క్ల ద్వారా సులభంగా ప్రసారం చేయడానికి ఈ అవుట్పుట్ Base64 ఫార్మాట్లో ఎన్కోడ్ చేయబడింది. మీరు ఎప్పుడైనా APIల ద్వారా ముడి బైనరీ డేటాను పంపడానికి ప్రయత్నించి ఉంటే మరియు మరొక వైపు అసంబద్ధతను ఎదుర్కొన్నట్లయితే, Base64 సిస్టమ్ల మధ్య పరస్పర చర్యను ఎలా సులభతరం చేస్తుందో మీరు అభినందిస్తారు. అదేవిధంగా, డిక్రిప్షన్ ఫంక్షన్ ప్రక్రియను రివర్స్ చేస్తుంది, అదే కీ మరియు IVని ఉపయోగించి Base64 సాంకేతికలిపిని తిరిగి మానవులు చదవగలిగే టెక్స్ట్గా మారుస్తుంది.
జావా స్ప్రింగ్ బూట్లోని బ్యాకెండ్ దాని డిక్రిప్షన్ అమలుతో ఎన్క్రిప్షన్ ప్రక్రియను ప్రతిబింబిస్తుంది. ఇది Base64-ఎన్కోడ్ చేయబడిన సాంకేతికలిపిని డీకోడ్ చేస్తుంది, AES సాంకేతికలిపిని అదే CTR మోడ్ మరియు IVతో ప్రారంభిస్తుంది మరియు రహస్య కీని వర్తింపజేస్తుంది. ఫలితంగా సాదా వచనం కాలర్కు తిరిగి వస్తుంది. కీలు మరియు IV ఫ్రంటెండ్ మరియు బ్యాకెండ్ మధ్య సరిగ్గా సరిపోలడం అనేది ఒక సాధారణ ఆపద. అలా చేయడంలో విఫలమైతే, సరిపోలని డిక్రిప్షన్ పారామీటర్లను సూచించే "తప్పుగా రూపొందించబడిన UTF-8" వంటి ఎర్రర్లకు దారితీయవచ్చు. ఈ సమస్యలను డీబగ్ చేయడంలో వివరాలకు ఖచ్చితమైన శ్రద్ధ అవసరం. ⚙️
ఈ స్క్రిప్ట్లు మాడ్యులారిటీ మరియు పునర్వినియోగత వంటి కీలక సాఫ్ట్వేర్ అభివృద్ధి సూత్రాలను కూడా ప్రదర్శిస్తాయి. `generateKey` మరియు `decrypt` వంటి ఫంక్షన్లు ఇతర సందర్భాల్లో మళ్లీ ఉపయోగించబడతాయి, నకిలీని తగ్గించడం మరియు నిర్వహణ సామర్థ్యాన్ని పెంచడం. అదనంగా, ప్రతి అమలు సురక్షిత అల్గారిథమ్లను ఉపయోగించడం, ఇన్పుట్ను ధృవీకరించడం మరియు పరిసరాలలో అనుకూలతను నిర్ధారించడం వంటి ఉత్తమ పద్ధతులను ఉపయోగిస్తుంది. ఇవి కేవలం కోడింగ్ వ్యాయామాలు కాదు; అవి సురక్షితమైన మరియు సమర్థవంతమైన డేటా నిర్వహణ కీలకమైన వాస్తవ-ప్రపంచ దృశ్యాలను ప్రతిబింబిస్తాయి. కస్టమర్ల చెల్లింపు వివరాలను ఫ్రంటెండ్లో గుప్తీకరించి, బ్యాకెండ్లో సురక్షితంగా డీక్రిప్ట్ చేయాల్సిన ఇ-కామర్స్ యాప్ వంటి దృష్టాంతం గురించి ఆలోచించండి. ఈ స్క్రిప్ట్లు మరియు అభ్యాసాలు ఆ లావాదేవీలను సురక్షితంగా ఉంచుతాయి. 🚀
క్రిప్టో-JSతో ఎన్క్రిప్షన్ మరియు డిక్రిప్షన్ సమస్యలను పరిష్కరించడం
ఈ పరిష్కారం ఫ్రంటెండ్ కోసం జావాస్క్రిప్ట్ మరియు బ్యాకెండ్ కోసం జావా స్ప్రింగ్ బూట్పై దృష్టి పెడుతుంది, ఎన్క్రిప్షన్ మరియు డిక్రిప్షన్ అనుకూలత సమస్యలను పరిష్కరిస్తుంది.
const iterationCount = 1000;
const keySize = 128 / 32;
function generateKey(salt, passPhrase) {
return CryptoJS.PBKDF2(
passPhrase,
CryptoJS.enc.Hex.parse(salt),
{ keySize, iterations: iterationCount }
);
}
function encrypt(salt, iv, plainText) {
const passPhrase = process.env.ENCRYPT_SECRET;
const key = generateKey(salt, passPhrase);
const encrypted = CryptoJS.AES.encrypt(
plainText,
key,
{
iv: CryptoJS.enc.Hex.parse(iv),
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding
}
);
return encrypted.ciphertext.toString(CryptoJS.enc.Base64);
}
function decrypt(salt, iv, cipherText) {
const passPhrase = process.env.DECRYPT_SECRET;
const key = generateKey(salt, passPhrase);
const decrypted = CryptoJS.AES.decrypt(
cipherText,
key,
{
iv: CryptoJS.enc.Hex.parse(iv),
mode: CryptoJS.mode.CTR,
padding: CryptoJS.pad.NoPadding
}
);
return decrypted.toString(CryptoJS.enc.Utf8);
}
జావా స్ప్రింగ్ బూట్లో బ్యాకెండ్ డిక్రిప్షన్
ఈ బ్యాకెండ్ సొల్యూషన్ డిక్రిప్షన్ను నిర్వహించడానికి మరియు ఫ్రంటెండ్ ఎన్క్రిప్షన్తో అనుకూలతను ధృవీకరించడానికి జావా స్ప్రింగ్ బూట్ను ఉపయోగిస్తుంది.
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class CryptoUtils {
public static String decrypt(String cipherText, String key, String iv) throws Exception {
byte[] decodedKey = Base64.getDecoder().decode(key);
byte[] ivBytes = iv.getBytes();
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
SecretKeySpec secretKey = new SecretKeySpec(decodedKey, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decodedCipherText = Base64.getDecoder().decode(cipherText);
byte[] decryptedText = cipher.doFinal(decodedCipherText);
return new String(decryptedText, "UTF-8");
}
}
ఫ్రంటెండ్ మరియు బ్యాకెండ్ కోసం యూనిట్ పరీక్షలు
ఎన్క్రిప్షన్ మరియు డిక్రిప్షన్ అనుగుణ్యతను ధృవీకరించడానికి ఫ్రంటెండ్ కోసం Jest మరియు బ్యాకెండ్ కోసం JUnit ఉపయోగించి యూనిట్ పరీక్షలు.
// Frontend Unit Test
test('Encrypt and decrypt data correctly', () => {
const salt = 'a1b2c3d4';
const iv = '1234567890123456';
const plainText = 'Hello, Crypto-JS!';
const encrypted = encrypt(salt, iv, plainText);
const decrypted = decrypt(salt, iv, encrypted);
expect(decrypted).toBe(plainText);
});
// Backend Unit Test
@Test
public void testDecrypt() throws Exception {
String cipherText = "EncryptedTextHere";
String key = "Base64EncodedKey";
String iv = "1234567890123456";
String decryptedText = CryptoUtils.decrypt(cipherText, key, iv);
Assert.assertEquals("Hello, Crypto-JS!", decryptedText);
}
ఎన్క్రిప్షన్లో డేటా ఎన్కోడింగ్ సవాళ్లను అధిగమించడం
ఎన్క్రిప్షన్లో తరచుగా విస్మరించబడే అంశం ఏమిటంటే, ఎన్క్రిప్షన్కు ముందు మరియు డీక్రిప్షన్ తర్వాత డేటా ఎలా ఎన్కోడ్ చేయబడుతుంది. ఫ్రంటెండ్ మరియు బ్యాకెండ్ మధ్య ఎన్కోడింగ్లో అసమతుల్యత "చెడు UTF-8" వంటి లోపాలకు దారి తీస్తుంది. ఉదాహరణకు, గుప్తీకరించిన డేటా Base64 ఫార్మాట్లో ప్రసారం చేయబడి, బ్యాకెండ్లో సరిగ్గా డీకోడ్ చేయబడితే, అది అసంపూర్ణమైన లేదా చెల్లని డేటాకు దారితీయవచ్చు. రెండింటినీ భరోసా మరియు ఈ ఆపదలను నివారించడానికి ఎన్కోడింగ్ పద్ధతులను అంగీకరించడం చాలా కీలకం. జావాస్క్రిప్ట్ మరియు జావా పరస్పర చర్య చేసే బహుళ-భాషా సిస్టమ్లలో ఎన్కోడింగ్ సమస్యలు తరచుగా కనిపిస్తాయి.
పాడింగ్ మరియు బ్లాక్ మోడ్లు ఎలా అమలు చేయబడతాయన్నది మరో కీలకమైన అంశం. మా ఉదాహరణలో, CTR మోడ్లోని AES పాడింగ్ అవసరాన్ని తొలగిస్తుంది, ఇది ఎన్క్రిప్షన్ మరియు డిక్రిప్షన్ను సులభతరం చేస్తుంది. అయినప్పటికీ, CBC వంటి ఇతర మోడ్లకు తరచుగా డేటా బ్లాక్లను పూర్తి చేయడానికి పాడింగ్ అవసరం. మీ సిస్టమ్లోని ఒక చివర పాడింగ్ని వర్తింపజేసి, మరొకటి చేయకపోతే, డిక్రిప్షన్ విఫలమవుతుంది. దీన్ని పరిష్కరించడానికి, డెవలపర్లు అన్ని సిస్టమ్లలో స్థిరమైన కాన్ఫిగరేషన్లను నిర్ధారించాలి. చిన్న మరియు పెద్ద పేలోడ్లతో పరీక్షించడం కూడా హ్యాండ్లింగ్లో అసమానతలను వెల్లడిస్తుంది.
చివరగా, బలమైన ఎన్క్రిప్షన్ కోసం కీలు మరియు ఇనిషియలైజేషన్ వెక్టర్స్ (IVలు) సురక్షితంగా నిర్వహించడం అవసరం. బలహీనమైన లేదా ఊహాజనిత IVని ఉపయోగించడం వలన బలమైన ఎన్క్రిప్షన్ అల్గారిథమ్లతో కూడా మీ డేటా భద్రతకు రాజీ పడవచ్చు. ఆదర్శవంతంగా, IVలు యాదృచ్ఛికంగా ఉత్పత్తి చేయబడాలి మరియు ఫ్రంటెండ్ మరియు బ్యాకెండ్ మధ్య సురక్షితంగా పంచుకోవాలి. సురక్షిత సందేశ యాప్ల వంటి అనేక వాస్తవ-ప్రపంచ అప్లికేషన్లు వినియోగదారు గోప్యత మరియు నమ్మకాన్ని కాపాడుకోవడానికి ఇటువంటి ఉత్తమ అభ్యాసాలపై ఆధారపడి ఉంటాయి. 🔒 సరిగ్గా అమలు చేయబడినప్పుడు, ఈ సిస్టమ్లు సంక్లిష్టమైన బహుళ-ప్లాట్ఫారమ్ ఎన్క్రిప్షన్ను కూడా సజావుగా నిర్వహించగలవు. 🚀
- "చెడు UTF-8" లోపానికి కారణమేమిటి?
- డీక్రిప్ట్ చేయబడిన డేటాను స్ట్రింగ్గా సరిగ్గా మార్చలేనప్పుడు ఈ లోపం సాధారణంగా సంభవిస్తుంది. గుప్తీకరించిన స్ట్రింగ్ సిస్టమ్లలో స్థిరంగా ఎన్కోడ్ చేయబడిందని మరియు డీకోడ్ చేయబడిందని నిర్ధారించుకోండి.
- ప్రారంభ వెక్టర్ (IV) యొక్క ప్రయోజనం ఏమిటి?
- ప్రతిసారీ ఒకే సాదాపాఠం విభిన్నంగా గుప్తీకరించబడుతుందని నిర్ధారించడానికి IV ఉపయోగించబడుతుంది. ఉదాహరణలో, IV వాదనగా ఆమోదించబడింది .
- కీ ఉత్పన్నం కోసం PBKDF2 ఎందుకు ఉపయోగించాలి?
- పాస్ఫ్రేజ్ నుండి క్రిప్టోగ్రాఫికల్ సురక్షిత కీని సృష్టిస్తుంది, బహుళ పునరావృత్తులు మరియు ఉప్పును వర్తింపజేయడం ద్వారా బలాన్ని జోడిస్తుంది.
- ఫ్రంటెండ్ మరియు బ్యాకెండ్ ఒకే ఎన్క్రిప్షన్ సెట్టింగ్లను ఉపయోగిస్తాయని నేను ఎలా నిర్ధారించగలను?
- రెండు సిస్టమ్లు తప్పనిసరిగా ఒకే కీ, IV, అల్గోరిథం, మోడ్ (ఉదా., CTR) మరియు పాడింగ్ సెట్టింగ్లను ఉపయోగించాలి. ఈ పారామితులు అనుకూలతకు కీలకం.
- JavaScript నుండి గుప్తీకరించిన డేటా జావాలో డీక్రిప్ట్ చేయడంలో విఫలమైతే నేను ఏమి చేయాలి?
- కీ మరియు IV సరిగ్గా పాస్ అయ్యాయని ధృవీకరించండి. ఉపయోగించి జావాలో Base64 డీకోడింగ్ని తనిఖీ చేయండి డిక్రిప్షన్ ముందు.
సిస్టమ్ల మధ్య ఎన్క్రిప్షన్ని నిర్వహించడానికి కీలు, IVలు మరియు ఎన్కోడింగ్ వంటి పారామీటర్లపై ఖచ్చితమైన శ్రద్ధ అవసరం. సెట్టింగ్లను ప్రామాణీకరించడం మరియు ఉత్తమ అభ్యాసాలను అనుసరించడం ద్వారా, మీరు సాధారణ ఆపదలను నివారించవచ్చు మరియు డేటా భద్రతను నిర్ధారించుకోవచ్చు. చెల్లింపు డేటాను భద్రపరచడం వంటి జీవిత ఉదాహరణలు, వాస్తవ ప్రపంచంలో ఈ సూత్రాలు ఎలా వర్తిస్తాయో చూపుతాయి. 🚀
మీరు ఉపయోగిస్తున్నా లేదా జావా బ్యాకెండ్లతో ఇంటిగ్రేట్ చేయడం, సరైన డీబగ్గింగ్ మరియు కాన్ఫిగరేషన్ మీ ఎన్క్రిప్షన్ను అతుకులుగా చేయవచ్చు. వివరించిన వ్యూహాలు సమస్యలను సమర్థవంతంగా పరిష్కరించడానికి రోడ్మ్యాప్ను అందిస్తాయి, మీ అప్లికేషన్లు వినియోగదారులకు దృఢంగా మరియు విశ్వసనీయంగా ఉండేలా చూస్తాయి.
- క్రిప్టో-JS లైబ్రరీ మరియు దాని ఎన్క్రిప్షన్ టెక్నిక్లపై వివరణాత్మక డాక్యుమెంటేషన్: క్రిప్టో-JS డాక్యుమెంటేషన్
- AES ఎన్క్రిప్షన్ కోసం జావా క్రిప్టోగ్రాఫిక్ లైబ్రరీ వివరాలు: జావా క్రిప్టోగ్రఫీ ఆర్కిటెక్చర్
- వెబ్ అప్లికేషన్లలో సురక్షిత గుప్తీకరణను అమలు చేయడానికి ఉత్తమ పద్ధతులు: OWASP టాప్ టెన్ ప్రాజెక్ట్
- ఎన్క్రిప్షన్లో సాధారణ UTF-8 ఎన్కోడింగ్ సమస్యల కోసం ట్రబుల్షూటింగ్ గైడ్: స్టాక్ ఓవర్ఫ్లో - UTF-8 సమస్యలు
- క్రాస్-ప్లాట్ఫారమ్ ఎన్క్రిప్షన్పై సాధారణ వనరులు: OWASP క్రిప్టోగ్రాఫిక్ స్టోరేజ్ చీట్ షీట్